Spring注册BeanDefinition和BeanPostProcessors到BeanFactory

一、Spring注册自己的BeanDefinition到BeanFactory

构造AnnotationConfigApplicationContext,
实例化AnnotatedBeanDefinitionReader对象时,
注册如下6个BeanDefinition到Bean工厂的beanDefinitionMap中

    0 = {BeanDefinitionHolder@799} "Bean definition with name 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor': Root bean: class [org.springframework.context.annotation.ConfigurationClassPostProcessor]; 
        BeanDefinitionRegistryPostProcessor -->  BeanFactoryPostProcessor
    
    1 = {BeanDefinitionHolder@800} "Bean definition with name 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor': Root bean: class [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor]; 
        BeanPostProcessor
    
    2 = {BeanDefinitionHolder@801} "Bean definition with name 'org.springframework.context.annotation.internalRequiredAnnotationProcessor': Root bean: class [org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor]; 
      BeanPostProcessor
    
    3 = {BeanDefinitionHolder@802} "Bean definition with name 'org.springframework.context.annotation.internalCommonAnnotationProcessor': Root bean: class [org.springframework.context.annotation.CommonAnnotationBeanPostProcessor]; 
        BeanPostProcessor
    
    4 = {BeanDefinitionHolder@803} "Bean definition with name 'org.springframework.context.event.internalEventListenerProcessor': Root bean: class [org.springframework.context.event.EventListenerMethodProcessor]; 
        ApplicationContextAware
    
    5 = {BeanDefinitionHolder@804} "Bean definition with name 'org.springframework.context.event.internalEventListenerFactory': Root bean: class [org.springframework.context.event.DefaultEventListenerFactory]; 
        EventListenerFactory

 二、Spring注册BeanPostProcessors到BeanFactory


1、准备BeanFactory时,注册了如下两个BeanPostProcessor到BeanFactory的 List<BeanPostProcessor> beanPostProcessors

    // Configure the bean factory with context callbacks.
    // 能够在bean中获取各种 *Aware (各Aware都有其作用)
    org.springframework.context.support.ApplicationContextAwareProcessor
    
    
    // Register early post-processor for detecting inner beans as ApplicationListeners.
    org.springframework.context.support.ApplicationListenerDetector

2、执行ConfigurationClassPostProcessor类中postProcessBeanFactory()(BeanFactoryPostProcessor接口的方法)方法中,注册一个BeanPostProcessor到BeanFactory的 List<BeanPostProcessor> beanPostProcessors

org.springframework.context.annotation.ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor

3、AnnotationConfigApplicationContext的refresh()中专门注册BeanPostProcessors
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
    
    从Bean工厂中取出BeanPostProcessor的Bean,有如下三个:

    0 = "org.springframework.context.annotation.internalAutowiredAnnotationProcessor"  AutowiredAnnotationBeanPostProcessor
    1 = "org.springframework.context.annotation.internalRequiredAnnotationProcessor"   RequiredAnnotationBeanPostProcessor
    2 = "org.springframework.context.annotation.internalCommonAnnotationProcessor"     CommonAnnotationBeanPostProcessor

    注册一个检测功能的BeanPostProcessor,用于当存在Bean实例化时没能执行全部的BeanPostProcessor时打印日志(BeanFactory中需要注册进去的BeanPostProcessor还么有完全注册进去,beanPostProcessors个数小于总的需要注册的个数),BeanPostProcessorChecker中提取存放了总的需要执行的BeanPostProcessor的个数(7)

    /**
     * BeanPostProcessor that logs an info message when a bean is created during
     * BeanPostProcessor instantiation, i.e. when a bean is not eligible for
     * getting processed by all BeanPostProcessors.
     */
    org.springframework.context.support.PostProcessorRegistrationDelegate.BeanPostProcessorChecker

    从Bean工厂中取出BeanPostProcessor的Bean都实现了PriorityOrdered接口,进行排序后优先注册到Bean工厂,排序后顺序为:
    0 = {CommonAnnotationBeanPostProcessor@1972} 
    1 = {AutowiredAnnotationBeanPostProcessor@1930} 
    2 = {RequiredAnnotationBeanPostProcessor@1953} 
    
    
    注册后的 7个    BeanPostProcessor如下:

    0 = {ApplicationContextAwareProcessor@1208} 
    1 = {ApplicationListenerDetector@1993} 
    2 = {ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor@1767} 
    3 = {PostProcessorRegistrationDelegate$BeanPostProcessorChecker@1900} 
    4 = {CommonAnnotationBeanPostProcessor@1972} 
    5 = {AutowiredAnnotationBeanPostProcessor@1930} 
    6 = {RequiredAnnotationBeanPostProcessor@1953} 

    最后将ApplicationListenerDetector移至最后,最终结果为:

    0 = {ApplicationContextAwareProcessor@1167} 
    1 = {ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor@1731} 
    2 = {PostProcessorRegistrationDelegate$BeanPostProcessorChecker@1732} 
    3 = {CommonAnnotationBeanPostProcessor@1733} 
    4 = {AutowiredAnnotationBeanPostProcessor@1734} 
    5 = {RequiredAnnotationBeanPostProcessor@1735} 
    6 = {ApplicationListenerDetector@1725} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值