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;
        }


    }

 


posted @ 2019-05-28 10:45  hello|world  阅读(1773)  评论(0编辑  收藏  举报