spring容器的生命周期
2022-01-26 10:33:01 0 举报
AI智能生成
spring容器的生命周期
作者其他创作
大纲/内容
实例化resourcePatternResolver
创建单例池singletonObjects,二级、三级缓存singletonFactories、earlySingletonObjects
创建List<BeanPostProcessor> beanPostProcessors,存储所有的bean后置处理器,它是一个CopyOnWriteArrayList,并且在修改时会清空beanPostProcessorCache
beanPostProcessorCache:里面缓存了不同类型的bean后置处理器,InstantiationAwareBeanPostProcessor、SmartInstantiationAwareBeanPostProcessor、DestructionAwareBeanPostProcessor、MergedBeanDefinitionPostProcessor
factoryBean创建对象的缓存factoryBeanObjectCache,factoryBeanName到缓存对象的映射
beanClassLoader,依次获取当前线程类加载器--》当前类的--》systemclassloader
beanDefinitionMap,生成的beanDefinition存放在这
组合beanFactory,并且向beanFactory设置autowireCandidateResolver,默认是ContextAnnotationAutowireCandidateResolver,它会在依赖注入-查找候选bean的时候根据@Qualifier,泛型,autowirecandidate筛选bean,以及处理@Lazy
向beanFactory注册默认的beanPostProcessor或beanFactoryPostProcessor的beanDefinition:ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、EventListenerMethodProcessor(处理@EventListener的)、DefaultEventListenerFactory
实例化AnnotatedBeanDefinitionReader
注册默认的扫描过滤器includeFilters、excludeFilters,默认是@Component、javax.annotation.ManagedBean、javax.inject.Named
实例化ClassPathBeanDefinitionScanner
使用BeanDefinitionReader和BeanDefinitionScanner读取和扫描BeanDefinition并注册进BeanDefinitionmap
添加ApplicationContextAwareProcesso、ApplicationListenerDetectorr实例到beanPostProcessors
添加environment到单例池
prepareBeanFactory
BeanFactoryPostProcessor是bean工厂的后置处理器,在注册bean定义之后,refresh实例化bean之前调用,因此这里修改bean定义会影响bean的实例化
最先执行的是非配置类定义的PriorityOrdered的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry,这里面包括了ConfigurationClassPostProcessor,它是处理@Bean和@Import的,在执行后置处理方法时有可能会向beanFactory添加新的Bean工厂的后置处理器,所有需要最先执行,而且后续需要再次根据类型从bean工厂获取后置处理器
再次根据类型从bean工厂获取后置处理器,依次执行配置类添加进来的PriorityOrdered和Ordered、非配置类定义的Ordered的postProcessBeanDefinitionRegistry
循环从bean工厂获取BeanDefinitionRegistryPostProcessor,执行postProcessBeanDefinitionRegistry,直到容器中没有新的BeanDefinitionRegistryPostProcessor
因为可能先注册进bean工厂,所以Ordered有可能比PriorityOrdered先执行,甚至普通的可能先于PriorityOrdered,要想保证顺序,必须在同一层级的BeanDefinitionRegistryPostProcessor被注册进来,或者不使用配置类注册(组件扫描)
最后执行BeanDefinitionRegistryPostProcessor.postProcessBeanFactory
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor不能添加bean定义,只能修改,所以不需要循环获取新的后置处理器,但仍需要每一批次重新根据beanName获取
先获取所有的BeanFactoryPostProcessor的beanName但先不创建bean,并按照PriorityOrded、Ordered、普通分成三份beanNames
按序执行实现了PriorityOrdered的BeanFactoryPostProcessor.postProcessBeanFactory,可能修改后续要执行的BeanFactoryPostProcessor的bean定义
根据beanName创建、执行实现了Ordered的BeanFactoryPostProcessor.postProcessBeanFactory
根据beanName创建、执行普通的BeanFactoryPostProcessor.postProcessBeanFactory
BeanFactoryPostProcessor排除BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor的postProcessBeanFactory会先于所有的其他BeanFactoryPostProcessor执行
BeanDefinitionRegistryPostProcessor拿到是BeanDefinition注册器: BeanDefinitionRegistry,可以注册beandefinition,BeanFactoryPostProcessor拿到的是可配置的beanfactory: ConfigurableListableBeanFactory,不能注册bean定义,只能修改
invokeBeanFactoryPostProcessors
根据beanDefinitionmap中的beanName实例化BeanPostProcessors,排序,添加进beanPostProcessors
已除原有的重新添加ApplicationListenerDetector实例
PriorityOrdered》Ordered》nonOrdered》MergedBeanDefinitionPostProcessor》ApplicationListenerDetector
registerBeanPostProcessors
MessageSource实例添加到单例池
initMessageSource
添加事件发布器initApplicationEventMulticaster到单例池,默认是SimpleApplicationEventMulticaster
initApplicationEventMulticaster
实例化ApplicationListener类型的bean注册到事件发布器applicationEventMulticaster
registerListeners
beanFactory.preInstantiateSingletons,实例化非懒加载的单例bean并添加到单例池
finishBeanFactoryInitialization
initLifecycleProcessor:向单例池中注册DefaultLifecycleProcessor,以便后续调用onRefresh
调用DefaultLifecycleProcessor.onRefresh,它实现了SmartLifeCycle的start和stop的执行
isRunning()==false时,start才会执行,isRunning()==true时,stop才会执行
getLifecycleProcessor().onRefresh();
finishRefresh
发布ContextRefreshedEvent事件,至此容器启动结束
refresh
spring容器的生命周期
0 条评论
回复 删除
下一页