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)
    
    最后方法返回
    
  • 相关阅读:
    第十一章 表单与验证
    第十章 日期与时间
    第九章 正则表达式
    第八章 字符串处理
    纯C实现面向对象之接口编程
    csharp 面向对象编程
    cpp面向对象编程
    javascriptMVC框架面向对象编程
    堆栈的区别
    Java堆栈简介
  • 原文地址:https://www.cnblogs.com/gocode/p/simple-spring-bean-lifecycle.html
Copyright © 2011-2022 走看看