【spring】beanDefinition 具体是什么时候注册到BeanFactory的
疑问: beanDefinition 是在何时注册到BeanFactory 的
大部分都了解springboot 的上下文初始化流程和自动配置的原理,我们针对 BeanFactory 实例化 单例对象前,所有的beanDefintion 的注册过程实行以下梳理。
1. 上下文创建的时候
不管是默认的上下文 AnnotationConfigApplicationContext 还是 web 工程AnnotationConfigServletWebServerApplicationContext 在其默认的构造器中都有一段代码逻辑
this.reader = new AnnotatedBeanDefinitionReader(this); // 触发注册bean定义
this.scanner = new ClassPathBeanDefinitionScanner(this);
在AnnotatedBeanDefinitionReader 构造中,触发了 注解的后置处理器bean 的定义和注册。
常规情况下注册的几个bean 定义如下:
具体的代码位置SpringApplication.run(),createApplicationContext(),BeanUtils.instantiateClass(反射实例化触发默认构造器)
2. 上下文刷新过程中
还是那句话,不管是web 项目还是普通项目,applicationContext.refresh() 都是一定会执行的方法。
具体的代码位置SpringApplication.run(),refreshContext(context),AbstractApplicationContext.refresh(),invokeBeanFactoryPostProcessors(beanFactory),PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors().
核心 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors 的执行过程可以参考 这篇博文
其过程中注册了几个关键的注册beanDefinition 的位置
- SharedMetadataReaderFactoryContextInitializer
SharedMetadataReaderFactoryContextInitializer.postProcessBeanDefinitionRegistry() 注册了 SharedMetadataReaderFactoryBean,并将其配置给 org.springframework.context.annotation.internalConfigurationAnnotationProcessor 的属性 metadataReaderFactory。 - ConfigurationClassPostProcessor
过程中会找到已注册beanDefinition 中是 BeanDefinitionRegistryPostProcessor 的bean,根据不同的优先级,依次进行注册。主要是ConfigurationClassPostProcessor,就是前面注册的name 为org.springframework.context.annotation.internalConfigurationAnnotationProcessor 对应的beanDefinition 的实际class 。
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()=>processConfigBeanDefinitions() 处理所有的Configuration 的配置类,解析并注册bean定义。
核心逻辑见下图:
包括:解析所有的Configuration 配置类,依次加载各个配置类注册bean。具体详情就不展开了。主要还是关注注册的时机。refresh 方法中的 invokeBeanFactoryPostProcessors(beanFactory) ,过程中一定是先把所有的bean注册完成,再执行 “BeanDefinitionRegistryPostProcessor” 和 “BeanFactoryPostProcessor” 的逻辑。