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字,非常硬核 系列文章目录和关于我 一丶从多鱼外卖开始 话说,王多鱼给好友胖子钱让其投资,希望亏得血本无归.胖子开了一个外卖店卖国宴,主打高端,外卖小哥都是自己雇佣,并且 ...
随机推荐
- vscode自动格式化python代码符合pep8
vscode自动格式化python代码符合pep8 安装格式化工具打开命令行窗口安装以下工具 $ pip install -U flake8$ pip install -U autopep812在VS ...
- 素数是个什么东西 prime number
/** * ********************************************************************* * 只有1和它本身两个正因数的自然数,叫质数 ...
- Ubuntu上解决快捷键与idea快捷键冲突
Ubuntu上解决快捷键与idea快捷键冲突 一.ubuntu 本身系统导致,需要修改 ubuntu 快捷键 解决方案: 设置 按钮→系统设置→硬件选项区域中的"键盘"→切换到&q ...
- ELK中 Elasticsearch和Logstash内存大小设置的考虑
本文为博主原创,转载请注明出处: 在ELK(Elasticsearch.Logstash和Kibana)日志采集和分析场景中,适当设置Logstash和Elasticsearch的内存大小非常重要.这 ...
- LAMP配置与应用
LAMP配置与应用 1.1 动态资源和语言 WEB 资源类型: 静态资源:原始形式与响应内容一致,在客户端浏览器执行 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端 ...
- 微信小程序:音乐播放器
音乐资源使用的是QQ音乐资源.图片资源使用的网易云音乐的专辑图片. HTML: <view class="container"> <div wx:for=&quo ...
- QT(9)-QStyleOption及其子类
1 QStyleOption QStyleOption及其子类包含QStyle函数绘制图形元素所需的所有信息. 出于性能考虑,成员函数很少,对成员变量的访问是直接的(即使用.或者->运算符).这 ...
- Node.js如何处理多个请求?
Node.js如何处理多个请求? 前言 在计算机科学领域,关于并发和并行的概念经常被提及.然而,这两个术语常常被混为一谈,导致很多人对它们的理解存在着很多混淆.本文小编将通过对并发和并行的深入解析,帮 ...
- CSP 2023 游只因
CSP \(2023\) 游只因 前面不写太多. Day \(-\frac{114514}{191}\) 雅礼(HN 四大名校)集训. Day 1:考试,讲题,改题. Day 2:考试,讲题,改题. ...
- Basic concepts of complex number
目录 虚数的引入 复数和虚数的关系 Example - 分辨一个数 判断两个复数是否相等的条件 共轭复数 复数的几何意义.复平面的认识 求复数的模 Reference 虚数的引入 假设有一个数,可以叫 ...