Spring扩展点:BeanDefinitionRegistryPostProcessor

淡淡的烟草味﹌ 2022-11-10 01:25 247阅读 0赞

  Spring的设计非常优雅,有很多的扩展点供我们对项目进行扩展,今天学习一下Spring其中之一扩展点———BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor

  当我们用Spring来管理应用,我们会让Spring来管理所有的Bean。除了注解Java配置XML配置的方式来创建Bean,还有另外一种方式来创建我们的BeanDefinition通过 BeanDefinitionRegistryPostProcessor可以创建一个特别的后置处理器,来将BeanDefinition添加到BeanDefinitionRegistry中

BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,是一种比较特殊的BeanFactoryPostProcessor。

BeanDefinitionRegistryPostProcessor中定义的postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)方法可以让我们实现自定义的注册bean定义的逻辑

  它和BeanPostProcessor不同,BeanPostProcessor只是在Bean初始化的时候有个钩子让我们加入一些自定义操作;而BeanDefinitionRegistryPostProcessor可以让我们在BeanDefinition中添加一些自定义操作。这就跟类与类实例之间的区别类似。

执行时机

所有的bean定义信息,即将要被加载到IOC容器中(其实还没有被加载到容器中),bean实例还没有被初始化时,BeanDefinitionRegistryPostProcessor被调用。

即:在bean定义还没有被加载,我们可以悄悄的往容器中添加一些东西

使用

  1. /** * TODO 自定义 BeanDefinitionRegisterPostProcessor * 执行时机:所有的bean定义信息将要被加载到容器中,Bean实例还没有被初始化。 * * @author : lzb * @date: 2021-03-15 17:46 */
  2. public class MyBeanDefinitionRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {
  3. @Override
  4. public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
  5. System.out.println("MyBeanDefinitionRegisterPostProcessor中的postProcessBeanDefinitionRegistry方法");
  6. System.out.println("bean定义的数据量:"+registry.getBeanDefinitionCount());
  7. RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Person.class);
  8. registry.registerBeanDefinition("person",rootBeanDefinition);
  9. }
  10. @Override
  11. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  12. System.out.println("MyBeanDefinitionRegisterPostProcessor中的postProcessBeanFactory方法");
  13. System.out.println(beanFactory.getBeanDefinitionCount());
  14. }
  15. }

使其生效,有如下两种方式:

方式一:使用@Configuration + @Bean 方式初始化

  1. /** * 定义一个主配置类,标识为@Configuration,通过@Bean方式初始化,注入IOC容器 */
  2. @Configuration
  3. public class MainConfig {
  4. @Bean
  5. public MyBeanDefinitionRegisterPostProcessor myBeanDefinitionRegisterPostProcessor () {
  6. return new MyBeanDefinitionRegisterPostProcessor ();
  7. }
  8. }

方式二:使用@ComponentScan + @Component方式初始化

  1. /** * 使用@ComponentScan定义组件扫描包范围,在可扫描的保范围内, * 然后使用@Component方式,将其定义为一个组件初始化,注入IOC容器 */
  2. @Component
  3. public class MyBeanDefinitionRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {
  4. @Override
  5. public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
  6. System.out.println("MyBeanDefinitionRegisterPostProcessor中的postProcessBeanDefinitionRegistry方法");
  7. System.out.println("bean定义的数据量:"+registry.getBeanDefinitionCount());
  8. // 新增一个bean定义(Person类)
  9. RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Person.class);
  10. // 将bean定义注册到Spring环境
  11. registry.registerBeanDefinition("person",rootBeanDefinition);
  12. }
  13. @Override
  14. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  15. System.out.println("MyBeanDefinitionRegisterPostProcessor中的postProcessBeanFactory方法");
  16. System.out.println(beanFactory.getBeanDefinitionCount());
  17. }
  18. }

关于重写的postProcessBeanFactory()方法说明:

  Spring中并没有具体去实现postProcessBeanFactory方法,是提供给想要实现BeanPostProcessor的三方框架使用的。谁要使用谁就去实现。作用是在BeanFactory准备工作完成后做一些定制化的处理,一般结合BeanPostProcessor接口的实现类一起使用,注入一些重要资源(类似Application的属性和ServletContext的属性)

执行结果

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,247人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring扩展

    在Spring框架中,有多个扩展点(Extension Point)可用于自定义和扩展应用程序的行为。这些扩展点允许开发人员介入Spring的生命周期和行为,并提供了灵活性和可