Spring扩展点:BeanDefinitionRegistryPostProcessor

  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定义还没有被加载,我们可以悄悄的往容器中添加一些东西

使用

/**
 * TODO 自定义 BeanDefinitionRegisterPostProcessor
 *      执行时机:所有的bean定义信息将要被加载到容器中,Bean实例还没有被初始化。
 *
 * @author : lzb
 * @date: 2021-03-15 17:46
 */
public class MyBeanDefinitionRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("MyBeanDefinitionRegisterPostProcessor中的postProcessBeanDefinitionRegistry方法");
        System.out.println("bean定义的数据量:"+registry.getBeanDefinitionCount());
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Person.class);
        registry.registerBeanDefinition("person",rootBeanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("MyBeanDefinitionRegisterPostProcessor中的postProcessBeanFactory方法");
        System.out.println(beanFactory.getBeanDefinitionCount());
    }
}

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

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

/**
 * 定义一个主配置类,标识为@Configuration,通过@Bean方式初始化,注入IOC容器
 */
@Configuration
public class MainConfig {

	@Bean
	public MyBeanDefinitionRegisterPostProcessor myBeanDefinitionRegisterPostProcessor () {
		return new MyBeanDefinitionRegisterPostProcessor ();
	}
	
}

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

/**
 * 使用@ComponentScan定义组件扫描包范围,在可扫描的保范围内,
 * 然后使用@Component方式,将其定义为一个组件初始化,注入IOC容器
 */
@Component
public class MyBeanDefinitionRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("MyBeanDefinitionRegisterPostProcessor中的postProcessBeanDefinitionRegistry方法");
        System.out.println("bean定义的数据量:"+registry.getBeanDefinitionCount());
        // 新增一个bean定义(Person类)
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Person.class);
        // 将bean定义注册到Spring环境
        registry.registerBeanDefinition("person",rootBeanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("MyBeanDefinitionRegisterPostProcessor中的postProcessBeanFactory方法");
        System.out.println(beanFactory.getBeanDefinitionCount());
    }
}

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

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

执行结果

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扛麻袋的少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值