• spring5.0 源码解析(day04)registerBeanPostProcessors(beanFactory);


    registerBeanPostProcessors(beanFactory)

    该方法主要用于 ** 注册bean的后置处理器,在Bean 创建过程中调用** 这一步的主要功能注册后置处理器
    BeanPostProcessor 接口是 Spring 初始化 bean 时对外暴露的扩展点,Spring IoC 容器允许 BeanPostProcessor 在容器初始化 bean 的前后,添加自己的逻辑处理。**在 **registerBeanPostProcessors 方法中是将BeanPostProcessor 注册到容器中统一管理

    // 允许自定义修改新bean实例的一个钩子方法
    public interface BeanPostProcessor {
    	// 应用于任何bean之前的给定新bean实例
    	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    	// 应用于任何bean之后的给定新bean实例
    	@Nullable
    	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    BeanPostProcessor 实现类和 BeanFactoryPostProcessor 实现类一样,也可以通过实现 PriorityOrdered、Ordered 接口来调整优先级 一次加入到容器中

    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
    
    		// 注册 BeanPostProcessorChecker,
    		// 它会在 BeanPostProcessor 实例化期间创建 bean 时记录信息消息,
    		// 即当 bean 没有资格被所有 BeanPostProcessor 处理时。
    		// 在 BeanPostProcessor 实例化期间创建一个 bean,即当一个 bean 没有资格被所有 BeanPostProcessor 处理时。
    
    		// beanProcessorTargetCount 用于目标计数  这个加法运算
    		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
    		// BeanPostProcessorChecker 主要用于 BeanPostProcessor实例化 创建是记录信息
    		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
    
    		// Separate between BeanPostProcessors that implement PriorityOrdered,
    		// Ordered, and the rest.  四个集合 区分实现不同接口的 BeanPostProcessors
    		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); //优先排序后处理器
    		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); //内部后处理器
    		List<String> orderedPostProcessorNames = new ArrayList<>();  //有序的后处理器名称
    		List<String> nonOrderedPostProcessorNames = new ArrayList<>(); // 非有序后处理器名称
    		for (String ppName : postProcessorNames) {
    			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    				priorityOrderedPostProcessors.add(pp);
    				if (pp instanceof MergedBeanDefinitionPostProcessor) {
    					internalPostProcessors.add(pp);
    				}
    			}
    			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    				orderedPostProcessorNames.add(ppName);
    			}
    			else {
    				nonOrderedPostProcessorNames.add(ppName);
    			}
    		}
    
    		// 首先,注册实现PriorityOrdered的BeanPostProcessors.
    		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
    
    		// 接下来,注册实现 Ordered 的 BeanPostProcessors.
    		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
    		for (String ppName : orderedPostProcessorNames) {
    			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    			orderedPostProcessors.add(pp);
    			if (pp instanceof MergedBeanDefinitionPostProcessor) {
    				internalPostProcessors.add(pp);
    			}
    		}
    		sortPostProcessors(orderedPostProcessors, beanFactory);
    		registerBeanPostProcessors(beanFactory, orderedPostProcessors);
    
    		//现在,注册所有常规 BeanPostProcessors
    		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
    		for (String ppName : nonOrderedPostProcessorNames) {
    			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    			nonOrderedPostProcessors.add(pp);
    			if (pp instanceof MergedBeanDefinitionPostProcessor) {
    				internalPostProcessors.add(pp);
    			}
    		}
    		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
    
    		// 最后,重新注册所有内部 BeanPostProcessors.
    		sortPostProcessors(internalPostProcessors, beanFactory);
    		registerBeanPostProcessors(beanFactory, internalPostProcessors);
    
    		// 重新注册用于将内部 bean 检测为 ApplicationListeners 的后处理器,
    		// 将其移动到处理器链的末尾(用于获取代理等).
    		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    在addBeanPostProcessor() 方法中我们可以看到 如果 BeanPostProcessor 存在 它会被放到尾部,
    因为 BeanPostProcessor 调用是采用责任链模式 所以beanPostProcessor也要严格按照顺序存储

    public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
    		Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
    		// Remove from old position, if any
    		this.beanPostProcessors.remove(beanPostProcessor);
    		// Add to end of list
    		this.beanPostProcessors.add(beanPostProcessor);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    通过 registerBeanPostProcessors 加载到容器中 beanPostProcessors
    在这里插入图片描述

    ApplicationContextAwareProcessor

    ApplicationContextAwareProcessor 是在 prepareBeanFactory()时添加进去的
    ApplicationContextAwareProcessor实现了BeanPostProcessor接口。并只重新定义了postProcessBeforeInitialization初始化前方法。可以让bean感知到容器的存在

    ApplicationListenerDetector

    ApplicationListenerDetector也是在 prepareBeanFactory()时添加进去的

    他的功能是检查bean 是否是ApplicationListener的子类 如果是则添加到ApplicationListener 中

    ConfigurationClassPostProcessor

    他是在为主配置类生成代理时传递进去的

    它的主要功能是参与BeanFactory的建造,在这个类中,会解析加了@Configuration的配置类,还会解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解。

    DestructionAwareBeanPostProcessor

    在销毁 Bean 前执行 Bean 所声明的自定义销毁方法,该回调只能应用到单例Bean。
    具体实现之一: InitDestroyAnnotationBeanPostProcessor:调用@PreDestroy注解的销毁方法。

    PostProcessorRegistrationDelegate

    用来注册和执行 BeanPostProcessor 和 BeanFactoryPostProcessors

    MergedBeanDefinitionPostProcessor

    MergedBeanDefinitionPostProcessor 接口是 BeanPostProcessor 的子接口,用于寻找注入点,所谓注入点其实就是被 Spring 所支持的注解所标记的属性或者方法,在AbstractAutowireCapableBeanFactory 类的 doCreateBean 方法中,Bean 被实例化之后就会调用applyMergedBeanDefinitionPostProcessors 方法。执行该后置处理器的postProcessMergedBeanDefinition 方法。
    MergedBeanDefinitionPostProcessor 有许多的子类,其中两个比较重要,分别是 AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor

    AutowiredAnnotationBeanPostProcessor

    AutowiredAnnotationBeanPostProcessor实现了 MergedBeanDefinitionPostProcessor,作用是查找bean中的被**@Autowired、@Value** 注解标注的属性与方法,如果有javax.inject.Inject依赖,那么也会查找被@Inject注解标注的属性与方法, 封装成InjectionMetadata对象。

    CommonAnnotationBeanPostProcessor

    CommonAnnotationBeanPostProcessor继承了 InitDestroyAnnotationBeanPostProcessor类。而InitDestroyAnnotationBeanPostProcessor类实现了MergedBeanDefinitionPostProcessor。
    作用与 AutowiredAnnotationBeanPostProcessor大致相同,只不过针对的是不同的注解。常见的注解有@PostConstruct、@PreDestroy、@Resource。如果有相对应的依赖,也可以使用@WebServiceRef、@EJB,也会被封装成InjectionMetadata对象。

  • 相关阅读:
    Redis学习路径(构建体系)
    【LeetCode热题100】--226.翻转二叉树
    【毕业设计】深度学习车道线检测与识别系统 - python 机器视觉
    基于SpringBoot的飘香水果购物网站
    前端页面项目——博客系统
    MySQL 视图(详解)
    Opencv高级图像处理
    一图看懂镜像
    淘宝/天猫按图搜索淘宝商品(拍立淘) API 返回值说明
    css选择器
  • 原文地址:https://blog.csdn.net/qq_44808472/article/details/126184308