spring(5.3.8)
一、启动流程及bean装配
AbstractApplicationContext
refresh()
1. prepareRefresh()
initPropertySources()
getEnvironment().validateRequiredProperties()
2. obtainFreshBeanFactory()
refreshBeanFactory()
createBeanFactory()
customizeBeanFactory(beanFactory)
loadBeanDefinitions(beanFactory)
getBeanFactory()
3. prepareBeanFactory(beanFactory)
4. postProcessBeanFactory(beanFactory)
5. invokeBeanFactoryPostProcessors(beanFactory)
6. registerBeanPostProcessors(beanFactory)
7. initMessageSource()
8. initApplicationEventMulticaster()
9. onRefresh()
10. registerListeners()
11. finishBeanFactoryInitialization(beanFactory)
1. beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class))
2. beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal))
3. getBean(weaverAwareName)
4. beanFactory.freezeConfiguration()
5. beanFactory.preInstantiateSingletons()
1. getBean(beanName)
1. doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
1. getSingleton(beanName)
2. markBeanAsCreated(beanName)
3. getMergedLocalBeanDefinition(beanName)
4. checkMergedBeanDefinition(mbd, beanName, args)
5. mbd.getDependsOn()
6. registerDependentBean(dep, beanName)
7. getBean(dep)
8. getSingleton(beanName, () -> {return createBean(beanName, mbd, args)})
1. beforeSingletonCreation(beanName)
2. singletonFactory.getObject()
1. createBean(beanName, mbd, args)
1. resolveBeanClass(mbd, beanName)
2. mbdToUse.prepareMethodOverrides()
3. resolveBeforeInstantiation(beanName, mbdToUse)
1. applyBeanPostProcessorsBeforeInstantiation(targetType, beanName)
2. applyBeanPostProcessorsAfterInitialization(bean, beanName)
4. doCreateBean(beanName, mbdToUse, args)
1. createBeanInstance(beanName, mbd, args)
2. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)
3. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean))
4. populateBean(beanName, mbd, instanceWrapper)
1. postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)
2. autowireByName(beanName, mbd, bw, newPvs)/autowireByType(beanName, mbd, bw, newPvs)
3. postProcessProperties(pvs, bw.getWrappedInstance(), beanName)
4. filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching)
5. postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName)
6. applyPropertyValues(beanName, mbd, bw, pvs)
5. initializeBean(beanName, exposedObject, mbd)
1. invokeAwareMethods(beanName, bean)
2. applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)
1. postProcessBeforeInitialization(result, beanName)
3. invokeInitMethods(beanName, wrappedBean, mbd)
1. afterPropertiesSet()
2. @postconstract/init-method
4. applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
1. postProcessAfterInitialization(result, beanName)
6. registerDisposableBeanIfNecessary(beanName, bean, mbd)
3. afterSingletonCreation(beanName)
4. addSingleton(beanName, singletonObject)
9. getObjectForBeanInstance(sharedInstance, name, beanName, mbd)
10. adaptBeanInstance(name, beanInstance, requiredType)
2. smartSingleton.afterSingletonsInstantiated();
12. finishRefresh()
二、BeanPostProcessor(bean生命周期中的扩展点)
1. BeanPostProcessor
1. postProcessBeforeInitialization(Object bean, String beanName)
2. postProcessAfterInitialization(Object bean, String beanName)
2. MergedBeanDefinitionPostProcessor extends BeanPostProcessor
1. postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)
2. resetBeanDefinition(String beanName)
3. InstantiationAwareBeanPostProcessors extends BeanPostProcessor
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
三、参考文章