Spring AOP的內部調用問題

前幾天遇到一個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;
        }


    }
相關文章
相關標籤/搜索