使用aop扫描不到对应的包解决办法

最近在搭建一个工程,想对返回值统一进行处理,用到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

上一篇:Spring学习-02 AOP


下一篇:傀儡政权之代理模式