zoukankan      html  css  js  c++  java
  • 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;
            }
    
    
        }
    
    
    
  • 相关阅读:
    JavaScript中的valueOf与toString方法
    CSS的历史与工作原理
    Javascript让你的网页标题飘动起来
    getElementsByClassName的原生实现
    JavaScript去除空格trim()的原生实现
    JavaScript截取中英文字符串
    Keras函数式API介绍
    R语言kohonen包主要函数介绍
    在Shell直接运行Python命令并显示
    GitHub Pages
  • 原文地址:https://www.cnblogs.com/wangchaoyu/p/10935791.html
Copyright © 2011-2022 走看看