自定义 BeanDefinitionRegistryPostPr

2021-07-09  本文已影响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)

参考

上一篇 下一篇

猜你喜欢

热点阅读