最近在搭建一个工程,想对返回值统一进行处理,用到aop,但是不论怎么测试,调方法都进入不了aop里的处理方法。请教同事后才解决。
AOP处理类核心代码:
@Aspect
@Component
public class ControllerAOP {
private static final Logger logger = LoggerFactory.getLogger(ControllerAOP.class);
@Pointcut("execution(public * com.demojava.controller..*(..))")
public void controllerPoint(){}
@Around("controllerPoint()")
public Object handlerControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
//这里面进行处理
}
而Controller确实是在com.demojava.controller包下的,为什么扫描不到呢?
分析pom.xml
我创建了ControllerAOP.java类,并加注解@Aspect、@Component,然后用idea自己引入了包。没报错就没去pom.xml里看。现在进去看看,发现它自动引入的是aspectjrt:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件;即静态代理。静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强。
解决方法一:
加入aspectjweaver的包:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
解决方法二:
加入cglib的包:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1</version>
</dependency>
而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。Spring aop与Aspectj的关系,前者动态代理最终是用的JDK api或者CGLIB来实现的;只是spring支持了Aspect的注解标签,没有依赖原生的aspect编译器。
解决方法三:
上方说的三个包都不需要,只引入spring-boot-starter-aop的包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<optional>true</optional>
</dependency>
文章参考:
AspectJ与CGLIB