Spring源码学习笔记4——BeanFactoryPostProcessor执行
一丶BeanFactoryPostProcessor是什么
Spring留给我们的一个扩展接口,在BeanDefinition加载注册完之后,并执行一些前置操作(笔记3)之后会反射生产所有的BeanFactoryPostProcessor实例并且回调对应的方法

可以做自定义的调整BeanDefinition等等操作,
二丶BeanDefinitionRegistryPostProcessor
实现了BeanFactoryPostProcessor 也是一个扩展接口,提供一个新的方法

但是这个方法入参是BeanDefinitionRegistry 不是BeanFactory
三丶BeanFactoryPostProcessor的调用时机与逻辑

重点在invokeBeanFactoryPostProcessors 方法中

除非我们自己实现一个ApplicationContext 覆盖AbstractRefreshableApplicationContext的 customizeBeanFactory方法预先设置一些BeanFactoryPostProcessor
1.执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry 方法
执行的前提是当前BeanFacotory实现了BeanRegistry
1.1 首先执行getBeanFactoryPostProcessors 中的BeanDefinitionRegistryPostProcessor
这部分没什么逻辑,按照list中的顺序依次调用即可
1.2 执行容器中BeanDefinitionRegistryPostProcessor类型的bean的postProcessBeanDefinitionRegistry方法
这部分需要注意顺序,优先执行实现了PriorityOrdered接口,表示是最高优先级,后面根据Ordered接口getOrder返回值 或者是@Order注解标注的优先级,进行排序(Ordered的值优先于Order注解)

注意这里还只调用了实现PriorityOrdered的BeanDefinitionRegistryPostProcessor,后续调用其他的BeanDefinitionRegistryPostProcessor,没有表明顺序的最后调用,调用的过程很简单,就是循环执行
1.3 调用BeanFactoryPostProcessor的postProcessBeanFactory 方法
流程类似于1.2,区别在于这里还会调用BeanDefinitionRegistryPostProcessor 的postProcessBeanFactory
四丶比较重要的实现

1.PropertyResourceConfigurer
提供根据配置文件内容替换BeanFactory内容的模板

这里指定了它的优先级是最低的,但是实现的是PriorityOrdered,这里有个点是——这个优先级是在PriorityOrdered中的优先,对于BeanFactoryPostProcessor来说,A类继承PriorityOrdered设置最低优先级,B类继承Ordered 设置最高优先级,那也是A类先执行

1.1 PropertyOverrideConfigurer
bean容器中定义了一个beanA,其中有一个属性propB,对应值为valueB,
但是我又希望在不更改bean定义的情况下希望
Spring在实例化beanA时将对应的属性propB的值改为valueC,
那么这个时候我们就可以使用PropertyOverrideConfigurer来实现这个效果了。PropertyOverrideConfigurer实现了BeanFactoryPostProcessor接口,
其将在Spring加载完对应容器中所有的bean定义之后
根据定义的属性来覆盖bean定义中既有属性的值
逻辑比较简单,就是替换BeanDefinition中PropertyValues(记录属性和对应属性值的一个集合)
1.2 PropertySourcesPlaceholderConfigurer
常用于解析${}中的内容,从配置文件中获取对应的配置,进行替换,可以使用:指定默认值
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${driver}" />
<property name="url" value="jdbc:${dbname}" />
</bean>
还可以用于数据库密码等脱敏
1.2.1设置解析前缀,后缀,和默认值分割符,以及是否裁剪,和默认的空值

1.2.2解析每一个BeanDefinition,以及别名,

2.ConfigurationClassPostProcessor
ConfigurationClassPostProcessor是一个BeanFactory的后置处理器,因此它的主要功能是参与BeanFactory的建造,在这个类中,会解析加了@Configuration的配置类,还会解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解。
这个类相当复杂,后续单独学习以下
Spring源码学习笔记4——BeanFactoryPostProcessor执行的更多相关文章
- Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点
Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- Spring源码学习笔记9——构造器注入及其循环依赖
Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...
- spring源码学习笔记之容器的基本实现(一)
前言 最近学习了<<Spring源码深度解析>>受益匪浅,本博客是对学习内容的一个总结.分享,方便日后自己复习或与一同学习的小伙伴一起探讨之用. 建议与源码配合使用,效果更嘉, ...
- Spring源码学习笔记之bean标签属性介绍及作用
传统的Spring项目, xml 配置bean在代码中是经常遇到, 那么在配置bean的时候,这些属性的作用是什么呢? 虽然说现在boot项目兴起,基于xml配置的少了很多, 但是如果能够了解这些标签 ...
- Spring源码学习笔记之基于ClassPathXmlApplicationContext进行bean标签解析
bean 标签在spring的配置文件中, 是非常重要的一个标签, 即便现在boot项目比较流行, 但是还是有必要理解bean标签的解析流程,有助于我们进行 基于注解配置, 也知道各个标签的作用,以及 ...
- Spring源码学习笔记1
1.Spring中最核心的两个类 1)DefaultListableBeanFactory XmlBeanFactory继承自DefaultListableBeanFactory,DefaultLis ...
- Spring源码学习笔记2
1.默认标签的解析 对四种不同标签的解析 private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate dele ...
- JUC源码学习笔记5——1.5w字和你一起刨析线程池ThreadPoolExecutor源码,全网最细doge
源码基于JDK8 文章1.5w字,非常硬核 系列文章目录和关于我 一丶从多鱼外卖开始 话说,王多鱼给好友胖子钱让其投资,希望亏得血本无归.胖子开了一个外卖店卖国宴,主打高端,外卖小哥都是自己雇佣,并且 ...
随机推荐
- python - view() + UpsamplingBilinear2d()
import torch from torch import nn # view函数的-1参数的作用在于基于另一参数,自动计算该维度的大小 # view的第一个参数:2 代表的是batch 后面的2, ...
- 基于ZXing.NET实现的二维码生成和识别客户端
一.前言 ZXing.Net的一个可移植软件包,是一个开源的.多格式的1D/2D条形码图像处理库,最初是用Java实现的.已经过大量优化和改进,它已经被手动移植.它与.Net 2.0..Net 3.5 ...
- Linux第一次周总结
第一章 初识 Linux 1.Linux简介 Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼),是一种免费使用和自由传播的类UNIX操作系统 ...
- 2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时, 返回
2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时, 返回 ...
- SaaS模式相较传统CRM系统有何优势?
SaaS模式的CRM客户管理系统相较于传统的CRM客户管理系统更加方便灵活,更加符合如今的市场环境.它解决了传统CRM系统投入大.维护难的难题,降低了中小企业导入CRM的门槛.下面详细说说SaaS模式 ...
- 下载kubernetes
前言 页面介绍了k8s的组件下载的方法 二进制文件 二进制文件的下载链接在CHANGELOG文件中,这里有一个技巧是直接下载Server Binaries,这个是包含了所有的二进制文件.下载后记得比对 ...
- ansible-playbook应用
ansible-playbook剧本: 如上使用Ad-hoc方式点对点命令执行,可以管理远程主机,如果服务器数量很多,配置信息比较多,还可以利用ansible playbook编写剧本.从而以非常简单 ...
- django admin字段设置大全
# 在列表页显示的字段,默认会显示所有字段,有对应的方法可以重写 list_display = ('__str__',) # 在列表页显示的字段中,可以链接到change_form页面的字段 list ...
- Python:发送邮件或发带附件的邮件
在进行发邮件之前,首先了解两个模块:smtplib和email. smtplib模块主要是负责发送邮件的,是一个发邮件的动作,比如连接邮箱服务,登录邮箱,发送邮件等. email模块主要是负责构造邮件 ...
- 树莓派4b部署samba服务实现文件共享
注意 samba 生命力很旺盛,软件是在不断更新的, 网上很多针对 samba 网速优化设置截止当前 实测发现有很多已经过期, 甚至有些设置会适得其反,使传输速度更低. 例如, 全网都在配置的参数,& ...