AnnotationConfigApplicationContext创建过程
2021-06-09 11:23:43 0 举报
图解AnnotationConfigApplicationContext创建过程
作者其他创作
大纲/内容
AnnotationConfigUtils.registerAnnotationConfigProcessors
getBeanFactory()
注册BeanPostProcessororg.springframework.context.annotation.internalAutowiredAnnotationProcessororg.springframework.context.annotation.internalCommonAnnotationProcessorBeanPostProcessorCheckerApplicationListenerDetector自定义BeanPostProcessor
添加AutowiredAnnotationBeanPostProcessor,用于处理解析@Autowire
initPropertySources
添加EventListenerMethodProcessor用于处理方法上的EventListener注解
添加PersistenceAnnotationBeanPostProcessor处理JPA
register注册组件配置类(JavaConfigClass)annotationConfigApplicationContext.register()
spring.context.beans.post-process BeanFactory初始化完成后的处理机制
publishEvent:ContextRefreshedEvent;
initApplicationEventMulticaster
添加ConfigurationClassPostProcessor,用于处理解析@Configuration、@ComponentScan、@Import、@Bean
执行非BeanDefinitionRegistry类型的BeanFactoryPostProcessor.postProcessBeanFactory当前EventListenerMethodProcessor以及其他自定义
执行BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry当前ConfigurationClassPostProcessor
父类GenericApplicationContext的构造方法中初始化的beanFactory this.beanFactory = new DefaultListableBeanFactory()
obtainFreshBeanFactory
ConfigurationClassBeanDefinitionReader处理配置类中Bean注解的类的注册处理import的配置的Bean的注册
registerListeners
这三步完成了BeanFactory的初始化
在Bean初始化(目前为止未初始化的)前后调用
AbstractApplicationContext.refresh()
spring.context.refresh 刷新Spring上下文
new ClassPathBeanDefinitionScanner用于对指定路径下的指定注解进行过滤,指定注解为:Component及包含Component的注解、javax.annotation.ManagedBean、javax.inject.Named
添加addBeanPostProcessor(new ImportAwareBeanPostProcessor
spring.context.config-classes.enhance
spring.context.bean-factory.post-process
执行BeanDefinitionRegistry类型的BeanFactoryPostProcessor.postProcessBeanFactory当前ConfigurationClassPostProcessor
new AnnotatedBeanDefinitionReader
clearResourceCaches
初始化MessageSourceinitMessageSource
spring.context.beandef-registry.post-process Bean定义注册完成后处理机制ConfigurationClassPostProcessor Step
执行LifecycleProcessor的onRefresh方法
自定义BeanFactoryPostProcessor执行
spring.context.annotated-bean-reader.create创建读取注解Bean的读取器
finishRefresh
查找BeanFactory中的所有BeanDefinitionRegistryPostProcessor类型的Bean定义并按照PriorityOrdered->Ordered->其他的顺序依次执行当前ConfigurationClassPostProcessor
getEnvironment().validateRequiredProperties()
DefaultEventListenerFactory用于处理类上的EventListener注解
finishBeanFactoryInitialization完成Bean定义中剩余为实例化的类的实例化工作,并调用SmartInitializingSingleton接口的实例的afterSingletonsInstantiated方法,这里是EventListenerMethodProcessor
注册所有EventListener注解的方法为单独的ApplicationListener实例
找到具有Configuration注解的Bean定义并按照@Order注解定义的顺序排序
spring.context.component-classes.register注册配置类
refreshBeanFactory
调用register方法
onRefresh
prepareRefresh
添加CommonAnnotationBeanPostProcessor用于处理JSR-250注解
spring.context.config-classes.parse解析配置类
initLifecycleProcessor,该生命周期钩子需要Context创建后显式调用,如果是SmartLifecycle的实现则Spring会自动调用
开始new AnnotationConfigApplicationContext()
通过ClassPathBeanDefinitionScanner对配置类进行解析,扫描指定路径下指定注解的Bean,并注册Bean
new ConditionEvaluator用于处理Conditional注解
prepareBeanFactory设置ClassLoader、设置两个BeanPostProcessor(ApplicationContextAwareProcessor、ApplicationListenerDetector)设置依赖注入时需要忽略的接口(主要为aware接口)注册特殊注入的接口类型(BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext)容器中放入Environment、SystemProperties、SystemEnvironment、ApplicationStartup四个实例
收藏
收藏
0 条评论
下一页