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)

最后方法返回
posted @ 2021-05-26 18:51  蜀中孤鹰  阅读(127)  评论(0编辑  收藏  举报