spring容器的生命周期
2022-01-26 10:33:01 0 举报
AI智能生成
spring容器的生命周期
作者其他创作
大纲/内容
实例化resourcePatternResolver
实例化beanFactory, 默认是DefaultListableBeanFactory<br>
创建单例池singletonObjects,二级、三级缓存singletonFactories、earlySingletonObjects<br>
创建List<BeanPostProcessor> beanPostProcessors,存储所有的bean后置处理器,它是一个CopyOnWriteArrayList,并且在修改时会清空beanPostProcessorCache<br>
beanPostProcessorCache:里面缓存了不同类型的bean后置处理器,InstantiationAwareBeanPostProcessor、SmartInstantiationAwareBeanPostProcessor、DestructionAwareBeanPostProcessor、MergedBeanDefinitionPostProcessor<br>
factoryBean创建对象的缓存factoryBeanObjectCache,factoryBeanName到缓存对象的映射
beanClassLoader,依次获取当前线程类加载器--》当前类的--》systemclassloader
mergedBeanDefinitions, 和父beanfactory合并之后的BeanDefinition缓存<br>
beanDefinitionMap,生成的beanDefinition存放在这
Map<Class<?>, Object> resolvableDependencies:依赖注入时,如果注入点类型是它的key的子类型,则将对应value添加到候选,默认用于BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext的非Aware注入
实例化AnnotatedBeanDefinitionReader<br>
组合beanFactory,并且向beanFactory设置autowireCandidateResolver,默认是ContextAnnotationAutowireCandidateResolver,它会在依赖注入-查找候选bean的时候根据@Qualifier,泛型,autowirecandidate筛选bean,以及处理@Lazy<br>
向beanFactory注册<b>默认的beanPostProcessor或beanFactoryPostProcessor的beanDefinition</b>:ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、<font color="#ff0000">EventListenerMethodProcessor(处理@EventListener的)、DefaultEventListenerFactory</font><br>
实例化ClassPathBeanDefinitionScanner
注册默认的扫描过滤器includeFilters、excludeFilters,默认是@Component、javax.annotation.ManagedBean、javax.inject.Named<br>
使用BeanDefinitionReader和BeanDefinitionScanner读取和扫描BeanDefinition并注册进BeanDefinitionmap<br>
refresh
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>
发布ContextRefreshedEvent事件,至此容器启动结束
0 条评论
下一页