BeanDefinitionRegistryPostProcessor接口
BeanDefinitionRegistryPostProcessor接口
该接口在注册bd期间,插手bd的属性
接口
BeanDefinitionRegistryPostProcessor
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
BeanDefinitionRegistryPostProcessor继承BeanFactoryPostProcessor,因此它需要实现两个方法
BeanFactoryPostProcessor
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
示例
Head
public class Head {
private Integer eyeNum;
public Integer getEyeNum() {
return eyeNum;
}
public void setEyeNum(Integer eyeNum) {
this.eyeNum = eyeNum;
}
}
Person
public class Person {
private Head head;
public Person(Head head) {
this.head = head;
}
public Head getHead() {
return head;
}
}
MyBeanDefinitionRegistryPostProcessor
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// 构建Head的BD
BeanDefinitionBuilder headBuilder = BeanDefinitionBuilder.genericBeanDefinition(Head.class);
headBuilder.getBeanDefinition().getPropertyValues().add("eyeNum",2);
// 构建Person的BD
BeanDefinitionBuilder personBuilder = BeanDefinitionBuilder.genericBeanDefinition(Person.class);
// 构造器引用容器中的head
personBuilder.addConstructorArgReference("head");
// 注册到BeanDefinitionRegistry中
registry.registerBeanDefinition("head",headBuilder.getBeanDefinition());
registry.registerBeanDefinition("person",personBuilder.getBeanDefinition());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Person bean = beanFactory.getBean(Person.class);
System.out.println("postProcessBeanFactory : "+bean.getHead().getEyeNum());
}
}
Main
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext();
configApplicationContext.register(Head.class);
configApplicationContext.addBeanFactoryPostProcessor(new MyBeanDefinitionRegistryPostProcessor());
configApplicationContext.refresh();
Head head = configApplicationContext.getBean(Head.class);
System.out.println("head : "+head.getEyeNum());
Person person = configApplicationContext.getBean(Person.class);
System.out.println("person : "+person.getHead().getEyeNum());
}
}
print :
postProcessBeanFactory : 2
head : 2
person : 2
作用
- MyBeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry()可以动态修改BD
- BD期间动态传入参数,修改构造器值
spring调用时机

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())详解
spring内部实现的类-ConfigurationClassPostProcessor
spring内部实现BeanDefinitionRegistryPostProcessor的类,用于插手bd的创建过程
作用
- 解析处理包含@PropertySources/@ImportResource/@ComponentScan的配置类
- 代理加入@Configuration注解类
执行链路
BeanDefinitionRegistryPostProcessor接口
https://www.blaaair.com/archives/beandefinitionregistrypostprocessor-jie-kou