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;
            }
    
    
        }
    
    
    
  • 相关阅读:
    软件下载链接获取方法
    【转】Linux 查看端口占用情况
    [转]SpringBoot第十集:国际化与Webjars的应用(2020最新最易懂)
    【转】Vue生命周期理解(带图的哦)
    Visual Studio 2019&WebStorm&CMD 创建vue项目
    Qt-Button使用QSS变图片按钮
    Qt-滚动条QSS样式
    Qt-鼠标点击别处隐藏widget
    OSG-修改osg鼠标中轮放大缩小的操作键
    OSG-在使用单位的kit编译osgQOpenGL时提示“语法错误:"unit"的前面应有“:””
  • 原文地址:https://www.cnblogs.com/wangchaoyu/p/10935791.html
Copyright © 2011-2022 走看看