前幾天遇到一個AOP內部調用不生效的問題,在網上查找了一些辦法java
一、使用@EnableAspectJAutoProxy(exposeProxy = true)註解app
而後調用AopContext.currentProxy() 獲取當前代理對象調用須要使用的方法ide
二、實現BeanPostProcessor接口,重寫postProcessAfterInitialization方法,在初始化的時候手動注入須要用到的對象post
第一種方法 我試了下沒起做用後臺會報錯,大概意思設置exposeProxy = true但是我已經設置了this
分析緣由多是我用定時器調用的方法而AopContext.currentProxy() 是使用ThreadLocal存儲的當前代理,多是線程上下文不一致致使獲取不到單籤代理。prototype
第二種方法是好用的附上代碼方便之後本身看,線程
@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; } }