最近在搭建一个工程,想对返回值统一进行处理,用到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
在搭建工程时遇到AOP无法生效的问题,尽管Controller位于指定包下,但AOP处理方法未被调用。通过检查pom.xml发现只引入了aspectjrt包,而非aspectjweaver或cglib。解决方法包括:1) 添加aspectjweaver依赖;2) 引入cglib包;3) 直接使用spring-boot-starter-aop启动器。文章探讨了AspectJ、CGLIB在Spring AOP中的作用以及动态代理的概念。
1万+

被折叠的 条评论
为什么被折叠?



