【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 定义如下:
注册的beanDefinition

具体的代码位置SpringApplication.run(),createApplicationContext(),BeanUtils.instantiateClass(反射实例化触发默认构造器)

2. 上下文刷新过程中

还是那句话,不管是web 项目还是普通项目,applicationContext.refresh() 都是一定会执行的方法。
具体的代码位置SpringApplication.run(),refreshContext(context),AbstractApplicationContext.refresh(),invokeBeanFactoryPostProcessors(beanFactory),PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors().
核心 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors 的执行过程可以参考 这篇博文

其过程中注册了几个关键的注册beanDefinition 的位置

  1. SharedMetadataReaderFactoryContextInitializer
    SharedMetadataReaderFactoryContextInitializer.postProcessBeanDefinitionRegistry() 注册了 SharedMetadataReaderFactoryBean,并将其配置给 org.springframework.context.annotation.internalConfigurationAnnotationProcessor 的属性 metadataReaderFactory。
  2. ConfigurationClassPostProcessor
    过程中会找到已注册beanDefinition 中是 BeanDefinitionRegistryPostProcessor 的bean,根据不同的优先级,依次进行注册。主要是ConfigurationClassPostProcessor,就是前面注册的name 为org.springframework.context.annotation.internalConfigurationAnnotationProcessor 对应的beanDefinition 的实际class 。
    ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()=>processConfigBeanDefinitions() 处理所有的Configuration 的配置类,解析并注册bean定义。
    核心逻辑见下图:
    解析注册bean定义
    包括:解析所有的Configuration 配置类,依次加载各个配置类注册bean。具体详情就不展开了。主要还是关注注册的时机。refresh 方法中的 invokeBeanFactoryPostProcessors(beanFactory) ,过程中一定是先把所有的bean注册完成,再执行 “BeanDefinitionRegistryPostProcessor” 和 “BeanFactoryPostProcessor” 的逻辑。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值