AfterReturning通知未执行求助:内部调用@Publish注解方法无触发
核心原因
Spring AOP默认靠动态代理实现功能:你从Spring容器拿到的Bean其实是代理对象,所有外部对Bean方法的调用都会经过代理层,切面逻辑就是在这一层插入的。但如果是Bean内部方法互相调用(比如methodA直接调methodB),这个调用是在原始对象上执行的,根本没经过代理层,自然触发不了切面通知。
解决办法
办法1:通过Spring上下文获取自身代理对象调用目标方法
修改业务类A,注入ApplicationContext,通过上下文拿到自身的代理对象,再用代理对象调用methodB:
@Component class A { @Autowired private ApplicationContext context; public String methodA() { A proxyA = context.getBean(A.class); return proxyA.methodB(); } @Publish public String methodB() { return "abc"; } }
办法2:开启暴露代理+用AopContext获取当前代理
- 先在配置类里开启暴露代理对象:
@Configuration @EnableAspectJAutoProxy(exposeProxy = true) public class AopConfig { }
- 修改
methodA的调用逻辑:
@Component class A { public String methodA() { A proxyA = (A) AopContext.currentProxy(); return proxyA.methodB(); } @Publish public String methodB() { return "abc"; } }
办法3:改用AspectJ织入(无需修改业务代码)
如果不想改动业务逻辑,可以放弃Spring AOP的动态代理,改用AspectJ的编译时/加载时织入。这种方式会直接修改字节码,不管是外部还是内部方法调用,都能被切面拦截。需要引入AspectJ相关依赖,并根据项目构建工具(Maven/Gradle)配置织入规则。
内容的提问来源于stack exchange,提问作者Gaurav
相关产品推荐
相关产品推荐

