Spring AOP的内部调用问题
Posted wangchaoyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring AOP的内部调用问题相关的知识,希望对你有一定的参考价值。
前几天遇到一个AOP内部调用不生效的问题,在网上查找了一些办法
1、使用@EnableAspectJAutoProxy(exposeProxy = true)注解
然后调用AopContext.currentProxy() 获取当前代理对象调用需要使用的方法
2、实现BeanPostProcessor接口,重写postProcessAfterInitialization方法,在初始化的时候手动注入需要用到的对象
第一种方法 我试了下没起作用后台会报错,大概意思设置exposeProxy = true可是我已经设置了
分析原因可能是我用定时器调用的方法而AopContext.currentProxy() 是使用ThreadLocal存储的当前代理,可能是线程上下文不一致导致获取不到单签代理。
第二种方法是好用的附上代码方便以后自己看,
@Configuration public class InjectBeanSelfProcessor implements BeanPostProcessor, ApplicationContextAware { private ApplicationContext applicationContext; @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { //如果Bean不是MyService跳过 if (!(bean instanceof MyService)) { return bean; } MyService service = (MyService) bean; //如果当前对象是AOP代理对象,直接注入 if (AopUtils.isAopProxy(bean)) { service.setSelf(bean); } else { //如果当前对象不是AOP代理,则通过context.getBean(beanName)获取代理对象并注入 //此种方式不适合解决prototype Bean的代理对象注入 service.setSelf(applicationContext.getBean(beanName)); } return bean; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }
//如果有多个类需要内部调用,可以用接口定义 //然后实现接口就行了 public class MyService { MyService proxySelf; public void setSelf(Object proxyBean) { this.proxySelf = (MyService) proxyBean; } }
以上是关于Spring AOP的内部调用问题的主要内容,如果未能解决你的问题,请参考以下文章
Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)