非spring如果使用切面aop

目錄

一、介紹

二、Demo

2.1 pom.xml 里面 引入相關(guān)的依賴和插件

2.2 再建一個(gè) Aspect

2.3 建一個(gè)對(duì)應(yīng)的 service 類

2.4 編譯

2.5 運(yùn)行

三、涉及點(diǎn)

3.1 includes 功能有缺陷

3.2 和 lombok 有沖突

一、介紹

本文介紹的 aspectj-maven-plugin 插件 和 我們 大部分使用的 Spring Aop 不同, 我們通常會(huì)在 帶有 @Aspect 注解的類上面 加上 @Service或者 @Component 注解,這樣就可以 被Spring 管理 ,這樣可以通過(guò)Aop 進(jìn)行一些攔截.

但是有時(shí) 有一個(gè)接口沒(méi)有在spring 注冊(cè), 但是也要對(duì)其攔截, 便可以使用 aspectj-maven-plugin, aspectj-maven-plugin 的相關(guān)介紹 aspectj-maven-plugin 的相關(guān)介紹 , 對(duì)應(yīng)的GitHub 地址 GitHub地址

aspectj-maven-plugin 插件是在 編譯階段 compile 對(duì)文件進(jìn)行增強(qiáng). ,可以從 生成的.class 文件可以看出.

其實(shí)從上面 兩個(gè)網(wǎng)址就完全可以 找到自己需要的信息,本文只是記錄一下相關(guān)使用 以及 對(duì)應(yīng)的includes 標(biāo)簽 功能上有一些缺陷, 如果有人 了解,還請(qǐng)指點(diǎn)。

二、Demo

2.1 pom.xml 里面 引入相關(guān)的依賴和插件

針對(duì)這里面的配置 相關(guān)解釋一下, 我用的 是IDEA 工具,不是Eclipse , IDEA 對(duì)這個(gè)插件有一些支持不太友好.

默認(rèn)為 false, 這里設(shè)置true,是 為了不讓IDEA 編譯, 但是 使用 Maven 或者 Jenkins 打包上線是沒(méi)有問(wèn)題的, 如運(yùn)行 命令:mvn clean compile(或者其他的 mvn clean package 都是可以的) , 主要是IDEA 編譯運(yùn)行時(shí) 里面的配置不生效, 但是在maven 里面 是會(huì)進(jìn)行替換掉的.

這里我選擇的是 1.8 ,對(duì)應(yīng)的是 aspectjtools 1.8.13 版本, 不同的版本是有一定的區(qū)別的,這里也需要注意.

這里是信息的顯示和忽略一些告警

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.13</version>
        </dependency>

   .   . .  .

<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.11</version>
                <configuration>
                    <complianceLevel>1.8</complianceLevel>
                    <source>1.8</source>
                    <target>1.8</target>
                    <showWeaveInfo>true</showWeaveInfo>
                  <Xlint>ignore</Xlint>
                    <encoding>UTF-8</encoding>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <configuration>
                            <skip>false</skip>
                        </configuration>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

2.2 再建一個(gè) Aspect

@Aspect
public class MethodEndAspect {

    @Before("execution(* com.test.service.UserServiceEnd.printLog())")
    public void setStartTimeInThreadLocal(JoinPoint joinPoint) {
        System.out.println("before ...");
    }


}

2.3 建一個(gè)對(duì)應(yīng)的 service 類

public class UserServiceEnd {
    public void printLog(){
        System.out.println(" no param.....");
    }
}

2.4 編譯

輸入 編譯命令,mvn clean compile

從提示可以看出 進(jìn)行了增強(qiáng), 同時(shí) 打開對(duì)應(yīng)的 .class 文件可以看出 也做了增強(qiáng).

2.5 運(yùn)行

成功進(jìn)行攔截,在控制臺(tái) 打印出了 相應(yīng)的日志

有人可能調(diào)試 不成功, 這里把 true 改成 false ,這樣 IDEA 就會(huì)用 Ajc 去編譯, 而不是默認(rèn)的javac , 也可以手動(dòng) 調(diào)整, 具體在 :

三、涉及點(diǎn)

使用也比較簡(jiǎn)單, 但是里面有2點(diǎn)不太友好

3.1 includes 功能有缺陷

從官方文檔 官方文檔 ,進(jìn)行測(cè)試,單純的 include 某一個(gè) aspect 是不生效的(exclude 是可以的),還需要具體指定 source 的地址, 即需要指定 使用的 地方,也就是 還要 配合 或者 標(biāo)簽使用, 個(gè)人感覺(jué)這個(gè)很不友好, 為啥不能使用默認(rèn)的 basedir 呢

3.2 和 lombok 有沖突

如果你在編譯的時(shí)候出現(xiàn)下面的信息, 那就是和lombok 沖突, 網(wǎng)上也有很多的做法啦,具體可以自行Googole,百度現(xiàn)在 搜的東西質(zhì)量越來(lái)越差.

java web 極速 框架fastboot 0.5.1上線

redis java客戶端那么多,該選擇哪一個(gè)

深入剖析Spring boot自動(dòng)裝配原理

架構(gòu)設(shè)計(jì)時(shí),如何通過(guò) maven or Gradle 來(lái)制作一個(gè) BOM 管理jar依賴版本

作者:java知路


歡迎關(guān)注微信公眾號(hào) :java知路