码迷,mamicode.com
首页 > 编程语言 > 详细

Spring AOP的内部调用问题

时间:2019-05-28 10:58:54      阅读:362      评论:0      收藏:0      [点我收藏+]

标签:exception   str   ica   his   elf   导致   自己   cat   npos   

前几天遇到一个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的内部调用问题

标签:exception   str   ica   his   elf   导致   自己   cat   npos   

原文地址:https://www.cnblogs.com/wangchaoyu/p/10935791.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!