BeanPostProcessor的注册

2022-09-24 08:29:40

由于md文档部分hugo插件语法不兼容,建议访问作者网站查阅文章:wlizhi.cc

spring源码系列文章,示例代码的中文注释,均是 copy 自https://gitee.com/wlizhi/spring-framework

链接中源码是作者从 github 下载,并以自身理解对核心流程及主要节点做了详细的中文注释。


1 BeanPostProcessor的作用

BeanPostProcessor是对SpringIOC容器中bean实例化的一些扩展,在bean实例化的关键节点进行了一些插桩。

真正实例化bean的方法是beanFactory.getBean()方法。而在bean实例化之前、实例化之后、依赖注入、初始化方法执行之前、初始化方法执行之后等节点进行一些钩子回调。BeanPostProcessor的作用就体现于此。

BeanPostProcessor接口只提供初始化方法执行前、后的节点操作。其余操作在它的子接口中定义。

2 BeanPostProcessor的体系结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GEKJPSZK-1607150566302)(https://oss.wlizhi.cc/blog/spring/BeanPostProcessor-inheritance-structure.png “BeanPostProcessor及其关键子接口的方法定义-UML图”)]

上图详细注释了BeanPostProcessor及其子接口每个方法的作用节点,从BeanPostProcessor接口继承体系可以看出,BeanPostProcessor贯穿整个Spring容器中Bean的实例化流程。可以说,在Spring容器中,任何一个Bean的实例化,在其关键节点,都有BeanPostProcessor的存在。甚至可以说它是SpringIOC容器组成部分中最重要的一个类。

3 BeanPostProcessor的注册流程

以下是spring中BeanPostProcessor的源码:

finalclassPostProcessorRegistrationDelegate{publicstaticvoidregisterBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext){// 从beanDefinitionNames中获取所有BeanPostProcessor类型的beanName。
		String[] postProcessorNames= beanFactory.getBeanNamesForType(BeanPostProcessor.class,true,false);// 这里之所以要+1,因为在这个方法的结尾处,单独注册了一个BeanPostProcessor:ApplicationListenerDetector// Register BeanPostProcessorChecker that logs an info message when// a bean is created during BeanPostProcessor instantiation, i.e. when// a bean is not eligible for getting processed by all BeanPostProcessors.int beanProcessorTargetCount= beanFactory.getBeanPostProcessorCount()+1+ postProcessorNames.length;
		beanFactory.addBeanPostProcessor(newBeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));// Separate between BeanPostProcessors that implement PriorityOrdered,// Ordered, and the rest.// 实现了PriorityOrdered接口的。
		List<BeanPostProcessor> priorityOrderedPostProcessors=newArrayList<>();// MergedBeanDefinitionPostProcessor类型的。
		List<BeanPostProcessor> internalPostProcessors=newArrayList<>();// 实现了Ordered接口的。
		List<String> orderedPostProcessorNames=newArrayList<>();// 没有实现排序接口的。
		List<String> nonOrderedPostProcessorNames=newArrayList<>();// 对以上四种情况进行分别处理。for(String ppName: postProcessorNames){if(beanFactory.isTypeMatch(ppName, PriorityOrdered.class)){
				BeanPostProcessor pp= beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);if(ppinstanceofMergedBeanDefinitionPostProcessor){
					internalPostProcessors.add(pp);}}elseif(beanFactory.isTypeMatch(ppName, Ordered.class)){
				orderedPostProcessorNames.add(ppName);}else{
				nonOrderedPostProcessorNames.add(ppName);}}// 注册BeanPostProcessors// First, register the BeanPostProcessors that implement PriorityOrdered.sortPostProcessors(priorityOrderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);// 注册实现了Ordered接口的BeanPostProcessor。// Next, register the BeanPostProcessors that implement Ordered.
		List<BeanPostProcessor> orderedPostProcessors=newArrayList<>();for(String ppName: orderedPostProcessorNames){
			BeanPostProcessor pp= beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);if(ppinstanceofMergedBeanDefinitionPostProcessor){
				internalPostProcessors.add(pp);}}sortPostProcessors(orderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, orderedPostProcessors);// 注册没有实现接口的BeanPostProcessor// Now, register all regular BeanPostProcessors.
		List<BeanPostProcessor> nonOrderedPostProcessors=newArrayList<>();for(String ppName: nonOrderedPostProcessorNames){
			BeanPostProcessor pp= beanFactory.getBean(ppName, BeanPostProcessor.class);
			nonOrderedPostProcessors.add(pp);if(ppinstanceofMergedBeanDefinitionPostProcessor){
				internalPostProcessors.add(pp);}}registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);// Finally, re-register all internal BeanPostProcessors.sortPostProcessors(internalPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, internalPostProcessors);// Re-register post-processor for detecting inner beans as ApplicationListeners,// moving it to the end of the processor chain (for picking up proxies etc).
		beanFactory.addBeanPostProcessor(newApplicationListenerDetector(applicationContext));}}

从上面代码可以看出,BeanPostProcessor的注册流程和BeanFactoryPostProcessor的注册流程类似。获取到BeanFactory中存储的BeanPostProcessor类型的beanName,然后对实现了不同排序接口的类、及没有实现排序接口的类分别进行getBean()操作、排序和注册。

spring会在不同的流程节点执行BeanPostProcessor及其子接口对应的方法。具体的实现类在后面的spring容器bean的实例化相关文章描述。

及没有实现排序接口的类分别进行getBean()操作、排序和注册。

spring会在不同的流程节点执行BeanPostProcessor及其子接口对应的方法。具体的实现类在后面的spring容器bean的实例化相关文章描述。

  • 作者:暗夜零星
  • 原文链接:https://blog.csdn.net/weixin_42067503/article/details/110684533
    更新时间:2022-09-24 08:29:40