类级注解@FooAnnotation的AspectJ方法日志实现问题排查
解决类级注解的AspectJ日志切面不生效问题
我来帮你梳理下问题所在,一步步搞定这个切面不生效的情况:
核心问题分析
你的代码里有几个关键错误导致切面没触发:
- 注解类名不匹配:你自定义的注解是
@FooAnnotation,但切点里写的是x.y.z.FooNotify,完全对应不上,Spring根本找不到标注了目标注解的类 - 通知方法权限错误:
@After标注的方法用了private修饰,Spring无法通过代理调用这个方法,切面自然不会生效 - 切点逻辑冗余且不准确:你写的三个切点里,只有
@within是用来匹配类上注解的,但另外两个要么匹配特定类内部方法,要么匹配方法上的注解,都不符合你的需求
修正后的完整切面代码
假设你的@FooAnnotation全限定类名是com.example.annotation.FooAnnotation,修正后的代码如下:
@Slf4j @Aspect @Component public class FooAspectJ { // 切点:匹配所有标注了@FooAnnotation的类中的任意方法 @Pointcut("@within(com.example.annotation.FooAnnotation) && execution(* *(..))") private void fooAnnotatedClassMethods() {} // 后置通知:方法执行后打印日志,注意这里用public修饰符 @After("fooAnnotatedClassMethods()") public void logAfterMethodExecution(JoinPoint joinPoint) { log.info("Executed annotated method: {}", joinPoint.getSignature().getName()); } }
关键修正点说明
- 修正注解类路径:把切点中的错误注解类名替换成你实际的
@FooAnnotation全限定类名,确保Spring能定位到标注了该注解的类 - 精准匹配目标方法:用
@within(com.example.annotation.FooAnnotation)匹配类上有该注解的Bean,再结合execution(* *(..))匹配这些类中的所有方法,完美覆盖你的需求 - 调整通知方法权限:把通知方法的
private改成public,让Spring代理能够正常调用这个方法 - 简化切点逻辑:移除了冗余的切点定义,让代码更清晰易读
额外需要确认的前提
- 确保你的
Bar类是Spring容器管理的Bean:比如给Bar添加@Component注解,或者通过@Bean方法注册到容器中,否则AspectJ无法对其进行代理 - 你的
@FooAnnotation已经设置了RetentionPolicy.RUNTIME,这一步你已经做对了,确保运行时能读取到注解
内容的提问来源于stack exchange,提问作者albertoiNET
相关产品推荐
相关产品推荐

