BeanDefinitionRegistryPostProcessor源码分析

  • Post author:
  • Post category:其他



    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.12.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.12.RELEASE</version>
        </dependency>
    </dependencies>

意思是bean定义注册中心后置处理,他继承了bean工厂后置处理器,

在所有bean定义还没有加载到bean工厂之前,先执行这个对应的方法

也就是在

BeanFactoryPostProcessor 之前被调用


我们来看下代码

public class Linux {

    public Linux(){
        System.out.println("实例化对象,创建对象,new对象");
    }

}

利用下面的代码 可以给容器注册一些组件

beanDefinitionRegistry.registerBeanDefinition

@Component
public class My implements BeanDefinitionRegistryPostProcessor {

    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        System.out.println("后置处理bean定义注册中心:"+beanDefinitionRegistry.getBeanDefinitionCount());
        //在这里 还可以往容器中注册 自定义bean
        RootBeanDefinition rootBeanDefinition=new RootBeanDefinition(Zd.class);
        beanDefinitionRegistry.registerBeanDefinition("zd",rootBeanDefinition);
        System.out.println("注册后bean定义数量:"+beanDefinitionRegistry.getBeanDefinitionCount());

    }

    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("bean定义的数量:"+configurableListableBeanFactory.getBeanDefinitionCount());
    }
}
/**
 * 实现bean工厂后置处理器,  使用@Component注解,吧当前对象注入到spring容器中
 */
@Component
public class Sp implements BeanFactoryPostProcessor {

    //bean定义已经加载到bean工厂, 但是还没有创建bean对象
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        
        String[] beanDefinitionNames = configurableListableBeanFactory.getBeanDefinitionNames();
        System.out.println("===========bean定义的名称====================");
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
        System.out.println("===============================");
    }
}
public class Test {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(TestConfig.class);

    }
}
//扫描包 使得 使用@Component注解生效
@ComponentScan("com.dmg")
@Configuration
public class TestConfig {


    //吧当前对象注入到容器中
    @Bean
    public Linux linux(){
        return new Linux();
    }

}

public class Zd {

    public Zd(){
        System.out.println("new zd");
    }
}

可以看到先执行了实现

BeanDefinitionRegistryPostProcessor类的对应方法


在执行实现了BeanFactoryPostProcessor类的方法


最后才是new对象,也就是创建实例,实例化对象

接下来我们来看下源码

可以看到在这里会执行bean定义注册中心后置处理方法

然后从容器中找到

BeanDefinitionRegistryPostProcessor放入currentRegistryProcessors

然后调用实现了bean定义注册中心后置处理的类 对应的方法,进入对应的类

当我们执行完了bean定义注册中心后置处理,

那么这个时候才执行bean工厂后置处理 调用

invokeBeanFactoryPostProcessors

在这里会从容器中找到

BeanFactoryPostProcessor


放入对应的regularPostProcessors,orderedPostProcessors,nonOrderedPostProcessors中

然后遍历所有的bean工厂后置处理,进入

postProcessBeanFactory方法

等这些走完之后,在执行

finishBeanFactoryInitialization方法


完成bean的创建,也就是new对象,实例化对象

最终的顺序就是


BeanDefinitionRegistryPostProcessor-》BeanFactoryPostProcessor


-》new对象