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 AOP不拦截从对象内部调用的方法

Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)

Spring AOP不拦截从对象内部调用的方法原因

Spring AOP为啥不能拦截从对象内部调用的方法

Spring AOP + AspectJ maven 插件 - 内部方法调用不起作用

Spring AOP不拦截从对象内部调用的方法原因