Spring之BeanFactory后置处理器

Spring之BeanFactory后置处理器

写在前面
  • BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作
  • BeanFactoryPostProcessor =>
    • BeanFactory后置处理器
    • 在beanFactory标准初始化之后调用
    • 所有的bean定义已经保存加载到beanFactory,bean实例对象还没有创建出来的时候执行

demo测试

在看源码之前,先写个demo测试一下

  1. 自定义一个MyBeanFactoryPostProcessor 实现BeanFactoryPostProcessor接口
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		System.out.println("MyBeanFactoryPostProcessor...postProcessBeanFactory");
		System.out.println("当前beanFactory中的bean数量:"+beanFactory.getBeanDefinitionCount());
		System.out.println("当前beanFactory中的bean名称:"+ Arrays.asList(beanFactory.getBeanDefinitionNames()));
	}
}
  1. 创建一个实体类,放到IOC容器中
public class Blue {
	public Blue(){
		System.out.println("blue......constructor");
	}
}
  1. 创建配置类
@Configuration
@ComponentScan("com.yang.ext")
public class MyExtConfig {
	@Bean
	public Blue blue(){
		return new Blue();
	}
}
  1. Test类
public class ExtTest {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MyExtConfig.class);
	}
}
  1. 执行结果
MyBeanFactoryPostProcessor...postProcessBeanFactory
当前beanFactory中的bean数量:8
当前beanFactory中的bean名称:[org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.event.internalEventListenerProcessor, org.springframework.context.event.internalEventListenerFactory, myExtConfig, myBeanFactoryPostProcessor, blue]
blue......constructor

从执行结果我们可以看出,blue的构造方法blue......constructor在最后执行,也就是在MyBeanFactoryPostProcessor#postProcessBeanFactory()之后执行

原理初探

让我们打个断点看看源码中BeanFactoryPostProcessor是如何执行的
在这里插入图片描述
接下来让我们一步步分析

  1. 初始化IOC容器,AnnotationConfigApplicationContext()
  2. refresh#invokeBeanFactoryPostProcessors(beanFactory)=>执行BeanFactory后置处理器
  3. PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())
    1. 如何找到所有BeanFactoryPostProcessor并执行他们的方法(由于源码太长,这里先省略了BeanDefinitionRegistryPostProcessor的部分)
      1. 直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
      2. 在初始化创建其他组件前面执行
public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

		// Invoke BeanDefinitionRegistryPostProcessors first, if any.
		Set<String> processedBeans = new HashSet<>();
		//开始执行BeanDefinitionRegistryPostProcessor
		if (beanFactory instanceof BeanDefinitionRegistry) {
			...此处省略
		}
		//结束执行BeanDefinitionRegistryPostProcessor
		
		//开始执行BeanFactoryPostProcessor
		// Do not initialize FactoryBeans here: We need to leave all regular beans
		// uninitialized to let the bean factory post-processors apply to them!
		//在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

		// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		//具有优先权的BeanFactory后置处理器List
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		//排序的BeanFactory后置处理器List
		List<String> orderedPostProcessorNames = new ArrayList<>();
		//没有排序的BeanFactory后置处理器List
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		//为什么这里,拥有优先权的后置处理器是直接将BeanFactoryPostProcessor对象保存在List中;而排序和未排序的只是存储了beanName???
		for (String ppName : postProcessorNames) {
		//分别存放BeanFactoryPostProcessor
			if (processedBeans.contains(ppName)) {
				// skip - already processed in first phase above
			}
			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
		//排序和未排序的List需要再遍历将BeanFactoryPostProcessor存储到新的List中
		// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		// Finally, invoke all other BeanFactoryPostProcessors.
		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		//MyBeanFactoryPostProcessor将会在这里被执行,下一步进入这个方法
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
		//结束执行BeanFactoryPostProcessor
		beanFactory.clearMetadataCache();
	}
/**
	 * Invoke the given BeanFactoryPostProcessor beans.
	 */
	private static void invokeBeanFactoryPostProcessors(
			Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {
		//遍历执行BeanFactoryPostProcessor 
		for (BeanFactoryPostProcessor postProcessor : postProcessors) {
			postProcessor.postProcessBeanFactory(beanFactory);
		}
	}

以上就是BeanFactoryPostProcessor 的调用过程

  • 为什么说BeanFactoryPostProcessor 在bean初始化之前执行,这个在refresh()中的执行顺序可以看出
    在这里插入图片描述

  • 疑问点:拥有优先权的后置处理器是直接将BeanFactoryPostProcessor对象保存在List中;而排序和未排序的只是存储了beanName???

关于BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor接口是BeanFactoryPostProcessor的一个子类
BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor

  • 在所有bean定义信息将要被加载,bean实例还未被创建的时候执行

  • 优先于BeanFactoryPostProcessor执行;

  • 利用BeanDefinitionRegistryPostProcessor 给容器中再额外添加一些组件

添加MyBeanDefinitionRegistryPostProcessor实现BeanDefinitionRegistryPostProcessor接口

@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		System.out.println("postProcessBeanFactory...Bean的数量:" + beanFactory.getBeanDefinitionCount());
	}
	/**
	 * BeanDefinitionRegistry:bean信息的保存中心,以后BeanFactory就是按照BeanDefinitionRegistry里面保存的每一个bean定义信息创建bean实例
	 * @param registry the bean definition registry used by the application context
	 * @throws BeansException
	 */
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		System.out.println("postProcessBeanDefinitionRegistry...Bean的数量:" + registry.getBeanDefinitionCount());
		//通过BeanDefinitionRegistry对象给Spring容器中手动添加bean
//		RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(X.class);
		BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Blue.class);
		registry.registerBeanDefinition("b",beanDefinitionBuilder.getBeanDefinition());
	}

}

执行结果

postProcessBeanDefinitionRegistry...Bean的数量:9
postProcessBeanFactory...Bean的数量:10
MyBeanFactoryPostProcessor...postProcessBeanFactory
当前beanFactory中的bean数量:10
当前beanFactory中的bean名称:[org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.event.internalEventListenerProcessor, org.springframework.context.event.internalEventListenerFactory, myExtConfig, myBeanDefinitionRegistryPostProcessor, myBeanFactoryPostProcessor, blue, b]
blue......constructor
blue......constructor

原理初探

  1. 创建IOC容器
  2. refresh()=>invokeBeanFactoryPostProcessors(beanFactory)
  3. 从容器中获取到所有的BeanDefinitionRegistryPostProcessor 组件
    1. 依次触发所有的postProcessBeanDefinitionRegistry()方法
    2. 再来触发postProcessBeanFactory()方法
  4. 再来从容器中获取所有BeanFactoryPostProcessor组件,然后依次触发postProcessBeanFactory()方法

以下是PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors 关于BeanDefinitionRegistryPostProcessor 部分的源码(其他部分在分析BeanFactoryPostProcessor时已贴出)

//开始执行BeanDefinitionRegistryPostProcessor
if (beanFactory instanceof BeanDefinitionRegistry) {
	BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
	List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
	List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

	for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
		if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
			BeanDefinitionRegistryPostProcessor registryProcessor =
					(BeanDefinitionRegistryPostProcessor) postProcessor;
			registryProcessor.postProcessBeanDefinitionRegistry(registry);
			registryProcessors.add(registryProcessor);
		}
		else {
			regularPostProcessors.add(postProcessor);
		}
	}

	// Do not initialize FactoryBeans here: We need to leave all regular beans
	// uninitialized to let the bean factory post-processors apply to them!
	// Separate between BeanDefinitionRegistryPostProcessors that implement
	// PriorityOrdered, Ordered, and the rest.
	List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

	// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
	String[] postProcessorNames =
			beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
	for (String ppName : postProcessorNames) {
		if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
			currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
			processedBeans.add(ppName);
		}
	}
	sortPostProcessors(currentRegistryProcessors, beanFactory);
	registryProcessors.addAll(currentRegistryProcessors);
	invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
	currentRegistryProcessors.clear();

	// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
	postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
	for (String ppName : postProcessorNames) {
		if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
			currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
			processedBeans.add(ppName);
		}
	}
	sortPostProcessors(currentRegistryProcessors, beanFactory);
	registryProcessors.addAll(currentRegistryProcessors);
	invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
	currentRegistryProcessors.clear();

	// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
	boolean reiterate = true;
	while (reiterate) {
		reiterate = false;
		postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
		for (String ppName : postProcessorNames) {
			if (!processedBeans.contains(ppName)) {
				currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
				processedBeans.add(ppName);
				reiterate = true;
			}
		}
		sortPostProcessors(currentRegistryProcessors, beanFactory);
		registryProcessors.addAll(currentRegistryProcessors);
		//MyBeanDefinitionRegistryPostProcessor=>postProcessBeanDefinitionRegistry在此被执行
		invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
		currentRegistryProcessors.clear();
	}
	MyBeanDefinitionRegistryPostProcessor=>postProcessBeanFactory在此被执行
	// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
	invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
	invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}

else {
	// Invoke factory processors registered with the context instance.
	invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}
//结束执行BeanDefinitionRegistryPostProcessor

关于BeanFactoryPostProcessor和 BeanDefinitionRegistryPostProcessor就先记录到这里,因为是刚开始看,所以源码中很多地方还没有添加注释,后续会慢慢添加上去。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值