美文网首页
自定义 BeanDefinitionRegistryPostPr

自定义 BeanDefinitionRegistryPostPr

作者: 蓝笔头 | 来源:发表于2021-07-09 15:06 被阅读0次

    接口定义

    package org.springframework.beans.factory.support;
    
    // 允许在常规 BeanFactoryPostProcessor 检测开始之前注册进一步的 bean 定义。
    // 特别是, BeanDefinitionRegistryPostProcessor 可以注册进一步的 bean 定义,这些定义又定义 BeanFactoryPostProcessor 实例。
    public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
    
        // 在标准初始化之后修改应用程序上下文的内部 bean 定义注册表。
        // 所有常规 bean 定义都将被加载,但尚未实例化任何 bean。
        // 这允许在下一个后处理阶段开始之前添加更多的 bean 定义。
        void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
    
    }
    

    自定义 BeanDefinitionRegistryPostProcessor

    1)定义 BeanDefinition 需要用到的类。

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public class User {
        private Long id;
        private String name;
    }
    

    2)定义 MyBeanDefinitionRegistryPostProcessor 实现 BeanDefinitionRegistryPostProcessor,并通过 @Component 注入到 Spring 容器中

    @Slf4j
    @Component
    public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
            createUserBeanDefinition(registry);
        }
    
        private void createUserBeanDefinition(BeanDefinitionRegistry registry) {
            // 1. 实例化一个 RootBeanDefinition
            RootBeanDefinition beanDefinition = new RootBeanDefinition();
            // 2. 设置 BeanClass
            beanDefinition.setBeanClass(User.class);
    
            // 3. 设置 构造方法对应的属性值
            ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();
            constructorArgumentValues.addGenericArgumentValue(1L);
            constructorArgumentValues.addGenericArgumentValue("huhu");
            beanDefinition.setConstructorArgumentValues(constructorArgumentValues);
    
            // 4. 注册到 Spring 容器中
            registry.registerBeanDefinition("user", beanDefinition);
        }
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            // do nothing
        }
    }
    

    BeanDefinition 相关操作可以参考:自定义 BeanDefinition

    3)启动 Spring 容器,并打印 User bean 的内容。

    @Slf4j
    @SpringBootApplication
    public class SpringDemoApplication {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext context = SpringApplication.run(SpringDemoApplication.class, args);
            System.out.println(context.getBean(User.class));
        }
    }
    

    控制台输出:

    User(id=1, name=huhu)
    

    参考

    相关文章

      网友评论

          本文标题:自定义 BeanDefinitionRegistryPostPr

          本文链接:https://www.haomeiwen.com/subject/dcyfpltx.html