prepareBeanFactory
添加ApplicationContextAwareProcesso、<font color="#ff0000">ApplicationListenerDetectorr</font>实例到beanPostProcessors<br>
添加BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext这些类型到Map<Class<?>, Object> resolvableDependencies,用于这些类型的非Aware方式的注入,其中ResourceLoader、ApplicationEventPublisher、ApplicationContext对应的实例都是applicationContext<br>
添加environment到单例池<br>
invokeBeanFactoryPostProcessors<br>
BeanFactoryPostProcessor是bean工厂的后置处理器,在注册bean定义之后,refresh实例化bean之前调用,因此<b>这里修改bean定义会影响bean的实例化</b>
BeanDefinitionRegistryPostProcessor
最先执行的是<b>非配置类定义</b>的PriorityOrdered的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry,这里面包括了ConfigurationClassPostProcessor,它是处理@Bean和@Import的,在执行后置处理方法时有<b>可能会向beanFactory添加新的Bean工厂的后置处理器</b>,所有需要最先执行,而且后续需要<b><font color="#ff0000">再次</font></b>根据类型从bean工厂获取后置处理器<br>
<b><font color="#ff0000">再次</font></b>根据类型从bean工厂获取后置处理器,依次执行配置类添加进来的PriorityOrdered和Ordered、非配置类定义的Ordered的postProcessBeanDefinitionRegistry<br>
<b>循环</b>从bean工厂获取BeanDefinitionRegistryPostProcessor,执行postProcessBeanDefinitionRegistry,<b>直到容器中没有新的BeanDefinitionRegistryPostProcessor</b><br>
<b>因为可能先注册进bean工厂,所以Ordered有可能比PriorityOrdered先执行,甚至普通的可能先于</b>PriorityOrdered,要想保证顺序,必须在同一层级的BeanDefinitionRegistryPostProcessor被注册进来,或者不使用配置类注册(组件扫描)
最后执行BeanDefinitionRegistryPostProcessor.postProcessBeanFactory
BeanFactoryPostProcessor排除BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor不能添加bean定义,只能修改,所以不需要循环获取新的后置处理器,但仍需要每一批次重新根据beanName获取
先获取所有的BeanFactoryPostProcessor的beanName但<b><font color="#ff0000">先不创建bean</font></b>,并按照PriorityOrded、Ordered、普通分成三份beanNames
按序执行实现了PriorityOrdered的BeanFactoryPostProcessor.postProcessBeanFactory,可能修改后续要执行的BeanFactoryPostProcessor的bean定义
根据beanName创建、执行实现了Ordered的BeanFactoryPostProcessor.postProcessBeanFactory
根据beanName创建、执行普通的BeanFactoryPostProcessor.postProcessBeanFactory
<b>BeanDefinitionRegistryPostProcessor的postProcessBeanFactory会先于所有的其他BeanFactoryPostProcessor执行</b>
BeanDefinitionRegistryPostProcessor拿到是BeanDefinition注册器: BeanDefinitionRegistry,可以<b>注册beandefinition</b>,BeanFactoryPostProcessor拿到的是可配置的beanfactory: ConfigurableListableBeanFactory,<b>不能注册bean定义,只能修改</b><br>
registerBeanPostProcessors<br>
根据beanDefinitionmap中的beanName实例化BeanPostProcessors,排序,添加进beanPostProcessors<br>
<font color="#ff0000">已除原有的重新添加ApplicationListenerDetector实例</font><br>
PriorityOrdered》Ordered》nonOrdered》<font color="#ff0000">MergedBeanDefinitionPostProcessor》ApplicationListenerDetector</font><br>
initMessageSource
MessageSource实例添加到单例池<br>
initApplicationEventMulticaster
添加事件发布器initApplicationEventMulticaster到单例池,默认是<font color="#ff0000">SimpleApplicationEventMulticaster</font><br>
registerListeners
实例化ApplicationListener类型的bean注册到事件发布器applicationEventMulticaster<br>
finishBeanFactoryInitialization
beanFactory.preInstantiateSingletons,实例化非懒加载的单例bean并添加到单例池<br>
finishRefresh
initLifecycleProcessor:向单例池中注册DefaultLifecycleProcessor,以便后续调用onRefresh<br>
getLifecycleProcessor().onRefresh();<br>
调用DefaultLifecycleProcessor.onRefresh,它实现了SmartLifeCycle的start和stop的执行
对于factoryBean,执行的是它本身的start,stop而不是getObject对象
<b>必须是autostartup返回true的SmartLifeCycle, LifeCycle的实现类不起作用</b><br>
SmartLifeCycle.phase()返回的int为顺序执行,start时小的phase先执行,stop时大的phase先执行, <b>出现依赖的情况时phase失效</b><br>
<b>start时当前bean的依赖如果实现了SmartLifeCycle, 则依赖先start,stop关闭时,依赖当前bean的先stop</b>
<b>isRunning()==false时,start才会执行,isRunning()==true时,stop才会执行</b>