非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知路