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;

}

示例

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

作用

  1. MyBeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry()可以动态修改BD
  2. BD期间动态传入参数,修改构造器值

spring调用时机

![postProcessBeanDefinitionRegistry](_v_images/20200408135615274_7445.png =626x)

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())详解

20200408140031833_27976

spring内部实现的类-ConfigurationClassPostProcessor

spring内部实现BeanDefinitionRegistryPostProcessor的类,用于插手bd的创建过程

作用

  1. 解析处理包含@PropertySources/@ImportResource/@ComponentScan的配置类
  2. 代理加入@Configuration注解类

执行链路

20200408142213304_19023


BeanDefinitionRegistryPostProcessor接口
https://www.blaaair.com/archives/beandefinitionregistrypostprocessor-jie-kou
作者
Glo6f
发布于
2023年06月18日
许可协议