You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AspectJ @Before注解日志功能失效问题求助

排查AspectJ切面不生效的问题

我来帮你一步步排查这个切面没生效的问题,大概率是以下几个常见原因之一:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:42:33