AspectJ @Before注解日志功能失效问题求助
我来帮你一步步排查这个切面没生效的问题,大概率是以下几个常见原因之一:
1. 切面类未被Spring容器接管
你的MyAspect类只加了@Aspect注解,但没有告诉Spring要把它作为Bean来管理。Spring AOP需要切面类是Spring容器中的Bean才能生效。
解决方法:给MyAspect加上@Component注解,同时确保它所在的包被Spring的组件扫描覆盖到:
@Aspect @Component // 新增这个注解 public class MyAspect { // ... 原有代码不变 }
2. @EnableAspectJAutoProxy的配置问题
你在ServletContextClass上加了@EnableAspectJAutoProxy,但要注意两个点:
- 这个配置类本身是否被Spring正确加载?比如它所在的包是否在
@ComponentScan的扫描范围内?如果Spring没读到这个配置类,自动代理就不会开启。 - 默认情况下
@EnableAspectJAutoProxy使用JDK动态代理,这种代理方式只对实现了接口的类生效。如果你的服务类没有实现任何接口,需要开启CGLIB代理:
@Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) // 开启CGLIB代理 public class ServletContextClass implements ServletContextListener { // ... 原有代码不变 }
3. 切点表达式的全类名是否正确
你的切点表达式是@annotation(com.utils.aop.annotations.MyAnnotation),请仔细核对MyAnnotation的实际包路径是否和这个一致。如果包名拼写错误,切点就匹配不到目标方法。
可以直接复制MyAnnotation类的全限定名替换到切点表达式里,避免手动拼写错误。
4. 目标方法所在类是否是Spring Bean
Spring AOP只能对Spring容器中的Bean生效。如果你的那个带有@POST、@Path的服务类没有被Spring管理(比如没加@Controller、@Service或者@Component注解),那么切面根本不会作用到它上面。
检查你的服务类是否添加了对应的Spring注解,并且被组件扫描到。
5. 日志级别配置问题
即使切面生效了,如果日志级别设置得太高,你也看不到输出。比如如果日志配置里把MyAspect的级别设成了WARN或者ERROR,logger.info的内容就不会打印出来。
可以先临时把logMethod里的日志改成System.out.println("Executing method: " + methodName);,或者调整日志配置,把MyAspect的日志级别设为INFO或更低。
额外检查:内部调用问题(针对非REST场景)
如果是同一个类内部调用带有@MyAnnotation的方法,Spring代理不会生效(因为绕过了代理对象),不过你的场景是外部REST请求调用,这个问题大概率不存在,但还是提一下供参考。
按照上面的步骤逐一排查,应该能解决切面不生效的问题。
内容的提问来源于stack exchange,提问作者BZHNomad

