IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> spring 源码注册BPP-registerBeanPostProcessors -> 正文阅读

[Java知识库]spring 源码注册BPP-registerBeanPostProcessors

上篇传送门
前两篇咱们了解了component-scan和其他一些注解的解析成bean定义信息的过程,前者是通过XML的方式loadBeanDefinition,后者通过ConfigurationClassPostProcessor来实现,那么这时候,bean的定义信息基本上算是完成了,接下来进行注册BPP

BPP就是用来拦截bean的创建,在初始化前后进行增强,具体细节咱们后面会详聊

  1. 获取所有BPP的bean名称
  2. 创建一个BeanPostProcessorChecker
  3. 遍历BPP名称
  4. 分组并实例化
  5. 注册

流程图
在这里插入图片描述

源码

public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
	// 获取所有的bean名称(这里是从bean定义信息中获取)
	String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
	// 创建一个BeanPostProcessorChecker,并给赋值BPP的数量
	int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
	beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
	// 实现了priorityOrdered的BPP对象
	List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
	// 内部的BPP对象
	List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
	// 实现了Order的BPP名称
	List<String> orderedPostProcessorNames = new ArrayList<>();
	// 普通的BPP名称
	List<String> nonOrderedPostProcessorNames = new ArrayList<>();
	for (String ppName : postProcessorNames) {
		//是否实现了PriorityOrdered
		if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
			// 创建实例
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			// 添加到集合中
			priorityOrderedPostProcessors.add(pp);
			// 如果属于MergedBeanDefinitionPostProcessor代表是内部的BPP
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				// 添加到内部的BPP集合中
				internalPostProcessors.add(pp);
			}
		}
		// 如果实现了Order接口,添加到ordered结合中
		else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
			orderedPostProcessorNames.add(ppName);
		}else {
			// 其他的是普通的BPP
			nonOrderedPostProcessorNames.add(ppName);
		}
	}
	// 排序
	sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
	//先注册实现了priorityOrdered接口的BPP
	registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
	// 存储实现了ordered接口的BPP
	List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
	for (String ppName : orderedPostProcessorNames) {
		// 实例化实现了Order接口的BPP
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		// 添加到失恋了ordered集合
		orderedPostProcessors.add(pp);
		// 如果实现了MergedBeanDefinitionPostProcessor代表是内部的BPP
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	// 对实现了order接口的BPP进行排序
	sortPostProcessors(orderedPostProcessors, beanFactory);
	// 注册实现了order接口的BPP
	registerBeanPostProcessors(beanFactory, orderedPostProcessors);
	// 创建普通BPP容器
	List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
	for (String ppName : nonOrderedPostProcessorNames) {
		// 实例化普通的BPP
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		// 添加到容器
		nonOrderedPostProcessors.add(pp);
		// 如果实现了MergedBeanDefinitionPostProcessor代表是内部BPP
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	// 注册普通的BPP
	registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
	// 对内部的BPP进行排序
	sortPostProcessors(internalPostProcessors, beanFactory);
	// 注册内部的BPP
	registerBeanPostProcessors(beanFactory, internalPostProcessors);
	// 最后注册Spring应用的探测器
	beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:35:37  更:2022-03-21 20:37:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:41:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码