zoukankan      html  css  js  c++  java
  • Spring Bean生命周期简图

    流程图

    Aware接口分类

        Aware Group1
            BeanNameAware
            BeanClassLoaderAware
            BeanFactoryAware
        Aware Group2
            EnvironmentAware
            EmbeddedValueResolverAware //该接口能够获取Spring EL解析器,用户的自定义注解需要支持spel表达式的时候可以使用,非常方便
            ApplicationContextAware
    
        //ApplicationContext复合接口
        public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
                MessageSource, ApplicationEventPublisher, ResourcePatternResolver {}
    
    
    

    getBean大致调用栈

    getBean
      doGetBean
        //先到缓存中(共三级,依次获取直到不为null为止),获取到sharedInstance
        //sharedInstance可能不是目标对象(可能是用来创建目标对象的工厂对象)
        //继续调用getObjectForBeanInstance获取真正的目标对象
        sharedInstance= getSingleton(beanName)
        beanInstance = getObjectForBeanInstance(sharedInstance,..)
        //当前缓存中没有目标bean,尝试到父容器中获取bean
        getParentBeanFactory().getBean()
        //没有父容器或父容器中没有这个bean,则分析依赖,依次对所有依赖的bean循环调用getBean
        mbd.getDependsOn() -> registerDependentBean ——> getBean
        //被依赖的所有bean构建完成后,再调用getSingleton(beanName,objectFactory)来构建目标bean
        getSingleton(beanName, () -> createBean(beanName, mbd, args))
            //createBean是回调函数,构建目标bean的核心在此
            createBean
            	// 循环调用所有的InstantiationAwareBeanPostProcessor,
            	// 方法返回值不为null就直接这个bean. AOP实现关键在此
                resolveBeforeInstantiation
                doCreateBean
        			//调用工厂方法(实现了FactoryBean接口或配置了工厂方法)或
        		    //反射调用构造方法(可能是无参的,也可能是有参的)实例化目标bean
                   createBeanInstance
        			//允许MergedBeanDefinitionPostProcessor后处理器修改bean定义
        			//如@Autowire ApplicationListenerDetector等
       			   applyMergedBeanDefinitionPostProcessors
        			//如果允许早期暴露,将单例工厂缓存起来,这是实现循环依赖的关键
       			   addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean))
                   populateBean
        			   //属性填充前,修改bean的状态,如基于字段的属性注入(不依赖于setter方法)
        			   InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
        			   //基于名字和类型的自动注入,这跟@Autowire注解没有任何关系,
        			   //可在xml中配置 autowire="byName|byType"
                       autowireByName//基于名字的自动注入
                       autowireByType//基于类型的自动注入
        			    //主要是各种@Autowire等注解方式的属性注入
       				   InstantiationAwareBeanPostProcessor#postProcessPropertyValues
        			   checkDependencies//检查依赖,可能抛出异常
        			   applyPropertyValues //将属性的值应用到目标bean		
                    initializeBean
                        //BeanNameAware BeanClassLoaderAware 
        			   //BeanFactoryAware 这三类aware函数接口依次调用
                       invokeAwareMethods(beanName, bean);
    				    //调用所有后处理器的初始化前方法
        			   applyBeanPostProcessorsBeforeInitialization
                              BeanPostProcessor#postProcessBeforeInitialization 
        			   //先执行InitializingBean#afterPropertiesSet接口方法
                        //再执行自定义的Init方法(xml中init-method指定的这类方法)
                       invokeInitMethods(beanName, wrappedBean, mbd);
        			    // 调用所有后处理器的初始化后方法
        			   applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    						BeanPostProcessor#postProcessAfterInitialization
                      //如果允许早期暴露,还将调用getSingleton(beanName, false),此方法最多到二级缓存
                      //中获取	bean,不会有第三级缓存中获取bean            
                     getSingleton(beanName, false);
    				  //注册bean销毁方法
    			     registerDisposableBeanIfNecessary()
                         //DisposableBeanAdapter将所有销毁方法合并有一起,
                         //放在自己的destroy中循环遍历依次调用。它很好的诠释了适配器模式
                        //先调用DestructionAwareBeanPostProcessor,再调用DisposableBean,最后调用自定义销毁方法
                         registerDisposableBean(DisposableBeanAdapter disposableBeanAdapter)
    
    最后方法返回
    
  • 相关阅读:
    POJ1239
    HDU 2829 四边形不等式优化
    返回数字二进制的最高位位数o(n)
    矩阵快速幂 模板
    HDU4718 The LCIS on the Tree(LCT)
    HDU4010 Query on The Trees(LCT)
    HDU3487 Play With Chains(Splay)
    CF444C DZY Loves Colors
    HDU4836 The Query on the Tree(树状数组&&LCA)
    HDU4831&&4832&&4834
  • 原文地址:https://www.cnblogs.com/gocode/p/simple-spring-bean-lifecycle.html
Copyright © 2011-2022 走看看