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的属性)
还没有评论,来说两句吧...