zoukankan      html  css  js  c++  java
  • spring使用BeanPostProcesor实现AOP源码分析

    源码

    AbstractApplicationContext#public void refresh() throws BeansException, IllegalStateException {
        finishBeanFactoryInitialization(beanFactory);
    };
    protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
        beanFactory.preInstantiateSingletons();
    }
    DefaultListableBeanFactory#public void preInstantiateSingletons() throws BeansException {
        getBean(beanName);
    }
    AbstractBeanFactory#public Object getBean(String name) throws BeansException {
        return doGetBean(name, null, null, false);
    }
    protected <T> T doGetBean() {
        return createBean(beanName, mbd, args);
    }
    AbstractAutowireCapableBeanFactory#protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
        Object beanInstance = doCreateBean(beanName, mbdToUse, args);
    }
    protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
                throws BeanCreationException {
        exposedObject = initializeBean(beanName, exposedObject, mbd);        
    }
    protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
        // 第二个参数bean,此时已经实例化好了,也已经属性注入了
        wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }
    public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) {
        result = beanProcessor.postProcessAfterInitialization(result, beanName);
    }
    interface BeanPostProcessor#Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
    AbstractAutoProxyCreator#public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if (bean != null) {
                Object cacheKey = getCacheKey(bean.getClass(), beanName);
                //  判断是否需要对此Bean生成代理
                if (!this.earlyProxyReferences.contains(cacheKey)) {
                    return wrapIfNecessary(bean, beanName, cacheKey);
                }
            }
            return bean;
        }
    protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
        if (beanName != null && this.targetSourcedBeans.contains(beanName)) {
            return bean;
        }
        if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
            return bean;
        }
        if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
            this.advisedBeans.put(cacheKey, Boolean.FALSE);
            return bean;
        }
    
        // Create proxy if we have advice.
        Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
        if (specificInterceptors != DO_NOT_PROXY) {
            this.advisedBeans.put(cacheKey, Boolean.TRUE);
            // 生成代理类
            Object proxy = createProxy(
                    bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
            this.proxyTypes.put(cacheKey, proxy.getClass());
            return proxy;
        }
    
        this.advisedBeans.put(cacheKey, Boolean.FALSE);
        return bean;
    }    
  • 相关阅读:
    MySQL 操作命令梳理(5)-执行sql语句查询即mysql状态说明
    MySQL 主从同步(5)-同步延迟状态考量(seconds_behind_master和pt-heartbea)
    MySQL 操作命令梳理(4)-中文乱码问题
    WebAssembly 介绍
    Android MVP
    Android Data Binding(数据绑定)用户指南
    认知心理学告诉你什么才是高效学习
    Android O新特性和行为变更总结zz
    音视频不同步问题的原因和解决方案
    当程序员写不出代码了,该怎么办?
  • 原文地址:https://www.cnblogs.com/Mike_Chang/p/10491289.html
Copyright © 2011-2022 走看看