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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值