spring启动及IOC

155 阅读3分钟

spring(5.3.8)

一、启动流程及bean装配

AbstractApplicationContext
    refresh()
        1. prepareRefresh()	//环境变量相关初始化及获取
            initPropertySources()	//环境变量初始化
            getEnvironment().validateRequiredProperties()	//环境变量校验
        2. obtainFreshBeanFactory() //获取beanFactory
            refreshBeanFactory()
                createBeanFactory()	//beanFactory 销毁及创建
                customizeBeanFactory(beanFactory)	//设置beanFactory是否可支持循环依赖、beanDifinition重写
                loadBeanDefinitions(beanFactory)	//beanDefinition加载(xml/annotation/groovy)
            getBeanFactory()
        3. prepareBeanFactory(beanFactory)	//初始化系统内置的BeanPostProcessor、忽略的依赖、内置的bean、属性转换器(PropertyEditor)等
        4. postProcessBeanFactory(beanFactory) //注册自定义及预制的BeanFactoryPostProcessor(beanDifinition 加载后实例化之前,用于重写beanDifinition)/BeanDefinitionRegistryPostProcessor(用于加载自定义beanDifinition,重写beanDifinition之前)
        5. invokeBeanFactoryPostProcessors(beanFactory) //执行BeanFactoryPostProcessor
        6. registerBeanPostProcessors(beanFactory) //注册自定义及预制的BeanPostProcessor,bean实例化前后、初始化前后执行一些扩展操作
        7. initMessageSource()
        8. initApplicationEventMulticaster()
        9. onRefresh()
        10. registerListeners()
        11. finishBeanFactoryInitialization(beanFactory)	// 对于非lazy的bean进行创建
                1. beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class))	//类型转换服务
                2. beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal))	//内置解析器,解析占位符
                3. getBean(weaverAwareName)	//优先创建织入的bean
                4. beanFactory.freezeConfiguration()	//冻结配置
                5. beanFactory.preInstantiateSingletons()	//实例化所有剩余的(非lazy-init)单例(Instantiate all remaining (non-lazy-init) singletons)
                    1. getBean(beanName)	//创建普通bean或通过factoryBean创建
                        1. doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
                            1. getSingleton(beanName)	//	先从三级缓存中取singletonObjects	->	earlySingletonObjects -> singletonFactories
                            2. markBeanAsCreated(beanName)	//标记bean已创建或正在创建中
                            3. getMergedLocalBeanDefinition(beanName)	//获取RootBeanDefinition
                            4. checkMergedBeanDefinition(mbd, beanName, args)	//校验RootBeanDefinition
                            5. mbd.getDependsOn()	//获取依赖bean
                            6. registerDependentBean(dep, beanName)	//注册依赖的bean
                            7. getBean(dep)	//初始化依赖的bean
                            8. getSingleton(beanName, () -> {return createBean(beanName, mbd, args)})	//创建当前bean  ObjectFactory () -> {return createBean(beanName, mbd, args)}
                                1. beforeSingletonCreation(beanName)	//bean加入singletonsCurrentlyInCreation
                                2. singletonFactory.getObject()	//创建bean
                                    1. createBean(beanName, mbd, args)
                                        1. resolveBeanClass(mbd, beanName)
                                        2. mbdToUse.prepareMethodOverrides()
                                        3. resolveBeforeInstantiation(beanName, mbdToUse)	//给BeanPostProcessors一个返回代理而不是目标bean实例的机会
                                            1. applyBeanPostProcessorsBeforeInstantiation(targetType, beanName) //InstantiationAwareBeanPostProcessors,实例化之前
                                            2. applyBeanPostProcessorsAfterInitialization(bean, beanName)	//BeanPostProcessor,初始化之后
                                        4. doCreateBean(beanName, mbdToUse, args)
                                            1. createBeanInstance(beanName, mbd, args) //实例化bean
                                            2. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)	//对有变更的beanDefinition做修改合并处理
                                            3. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)) // 提前暴露引用到singletonFactories
                                            4. populateBean(beanName, mbd, instanceWrapper) //填充属性
                                                1. postProcessAfterInstantiation(bw.getWrappedInstance(), beanName) //InstantiationAwareBeanPostProcessors 实例化后额外操作
                                                2. autowireByName(beanName, mbd, bw, newPvs)/autowireByType(beanName, mbd, bw, newPvs)	//按名称、类型自动注入
                                                3. postProcessProperties(pvs, bw.getWrappedInstance(), beanName)	//InstantiationAwareBeanPostProcessors 属性填充
                                                4. filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching)	//获取不需要填充的依赖
                                                5. postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName)	//InstantiationAwareBeanPostProcessors  依赖过滤	属性填充
                                                6. applyPropertyValues(beanName, mbd, bw, pvs)
                                            5. initializeBean(beanName, exposedObject, mbd) //执行初始化相关操作
                                                1. invokeAwareMethods(beanName, bean) //aware相关接口执行
                                                2. applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName) //
                                                    1. postProcessBeforeInitialization(result, beanName)	//BeanPostProcessor
                                                3. invokeInitMethods(beanName, wrappedBean, mbd)
                                                    1. afterPropertiesSet() //InitializingBean
                                                    2. @postconstract/init-method
                                                4. applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
                                                    1. postProcessAfterInitialization(result, beanName)	//BeanPostProcessor
                                            6. registerDisposableBeanIfNecessary(beanName, bean, mbd)
                                3. afterSingletonCreation(beanName)	//bean从singletonsCurrentlyInCreation移除
                                4. addSingleton(beanName, singletonObject)	//bean加入一级缓存singletonObjects并从二、三级缓存删除、加入registeredSingletons
                            9. getObjectForBeanInstance(sharedInstance, name, beanName, mbd)	//获取真正的bean
                            10. adaptBeanInstance(name, beanInstance, requiredType)	//调整当前bean
                    2. smartSingleton.afterSingletonsInstantiated();	//SmartInitializingSingleton,bean初始化完成最后做的操作
        12. finishRefresh()	

二、BeanPostProcessor(bean生命周期中的扩展点)

1. BeanPostProcessor //bean实例化后属性填充完成,对bean初始化操作的前后拦截操作
        1. postProcessBeforeInitialization(Object bean, String beanName)
        2. postProcessAfterInitialization(Object bean, String beanName)

2. MergedBeanDefinitionPostProcessor extends BeanPostProcessor 	//beanDefinition设置
        1. postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)
        2. resetBeanDefinition(String beanName)

3. InstantiationAwareBeanPostProcessors extends BeanPostProcessor //bean实例化前后及实例化后属性填充前相关操作
        1. postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
        2. postProcessAfterInstantiation(Object bean, String beanName)
        3. postProcessProperties(PropertyValues pvs, Object bean, String beanName)
        4. postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)

4. SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessors

三、参考文章