目录
一、介绍
本文介绍的 aspectj-maven-plugin 插件 和 我们 大部分使用的 Spring Aop 不同, 我们通常会在 带有 @Aspect 注解的类上面 加上 @Service或者 @Component 注解,这样就可以 被Spring 管理 ,这样可以通过Aop 进行一些拦截.
但是有时 有一个接口没有在spring 注册, 但是也要对其拦截, 便可以使用 aspectj-maven-plugin, aspectj-maven-plugin 的相关介绍 aspectj-maven-plugin 的相关介绍 , 对应的GitHub 地址 GitHub地址
aspectj-maven-plugin 插件是在 编译阶段 compile 对文件进行增强. ,可以从 生成的.class 文件可以看出.
其实从上面 两个网址就完全可以 找到自己需要的信息,本文只是记录一下相关使用 以及 对应的includes 标签 功能上有一些缺陷, 如果有人 了解,还请指点。
二、Demo
2.1 pom.xml 里面 引入相关的依赖和插件
针对这里面的配置 相关解释一下, 我用的 是IDEA 工具,不是Eclipse , IDEA 对这个插件有一些支持不太友好.
默认为 false, 这里设置true,是 为了不让IDEA 编译, 但是 使用 Maven 或者 Jenkins 打包上线是没有问题的, 如运行 命令: mvn clean compile(或者其他的 mvn clean package 都是可以的) , 主要是IDEA 编译运行时 里面的配置不生效, 但是在maven 里面 是会进行替换掉的.
这里我选择的是 1.8 ,对应的是 aspectjtools 1.8.13 版本, 不同的版本是有一定的区别的,这里也需要注意.
这里是信息的显示和忽略一些告警
<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 再建一个 Aspect
@Aspect
public class MethodEndAspect {
@Before("execution(* com.test.service.UserServiceEnd.printLog())")
public void setStartTimeInThreadLocal(JoinPoint joinPoint) {
System.out.println("before ...");
}
}
2.3 建一个对应的 service 类
public class UserServiceEnd {
public void printLog(){
System.out.println(" no param.....");
}
}
2.4 编译
输入 编译命令,mvn clean compile
从提示可以看出 进行了增强, 同时 打开对应的 .class 文件可以看出 也做了增强.
2.5 运行
成功进行拦截,在控制台 打印出了 相应的日志
有人可能调试 不成功, 这里把 true 改成 false ,这样 IDEA 就会用 Ajc 去编译, 而不是默认的javac , 也可以手动 调整, 具体在 :
三、涉及点
使用也比较简单, 但是里面有2点不太友好
3.1 includes 功能有缺陷
从官方文档 官方文档 ,进行测试,单纯的 include 某一个 aspect 是不生效的(exclude 是可以的),还需要具体指定 source 的地址, 即需要指定 使用的 地方,也就是 还要 配合 或者 标签使用, 个人感觉这个很不友好, 为啥不能使用默认的 basedir 呢
3.2 和 lombok 有冲突
如果你在编译的时候出现下面的信息, 那就是和lombok 冲突, 网上也有很多的做法啦,具体可以自行Googole,百度现在 搜的东西质量越来越差.
支付宝 | 微信 |
---|---|
如果有帮助记得打赏哦 | 特别需要您的打赏哦 |