一丶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执行的更多相关文章

  1. Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...

  2. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  3. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  4. Spring源码学习笔记9——构造器注入及其循环依赖

    Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...

  5. spring源码学习笔记之容器的基本实现(一)

    前言 最近学习了<<Spring源码深度解析>>受益匪浅,本博客是对学习内容的一个总结.分享,方便日后自己复习或与一同学习的小伙伴一起探讨之用. 建议与源码配合使用,效果更嘉, ...

  6. Spring源码学习笔记之bean标签属性介绍及作用

    传统的Spring项目, xml 配置bean在代码中是经常遇到, 那么在配置bean的时候,这些属性的作用是什么呢? 虽然说现在boot项目兴起,基于xml配置的少了很多, 但是如果能够了解这些标签 ...

  7. Spring源码学习笔记之基于ClassPathXmlApplicationContext进行bean标签解析

    bean 标签在spring的配置文件中, 是非常重要的一个标签, 即便现在boot项目比较流行, 但是还是有必要理解bean标签的解析流程,有助于我们进行 基于注解配置, 也知道各个标签的作用,以及 ...

  8. Spring源码学习笔记1

    1.Spring中最核心的两个类 1)DefaultListableBeanFactory XmlBeanFactory继承自DefaultListableBeanFactory,DefaultLis ...

  9. Spring源码学习笔记2

    1.默认标签的解析 对四种不同标签的解析 private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate dele ...

  10. JUC源码学习笔记5——1.5w字和你一起刨析线程池ThreadPoolExecutor源码,全网最细doge

    源码基于JDK8 文章1.5w字,非常硬核 系列文章目录和关于我 一丶从多鱼外卖开始 话说,王多鱼给好友胖子钱让其投资,希望亏得血本无归.胖子开了一个外卖店卖国宴,主打高端,外卖小哥都是自己雇佣,并且 ...

随机推荐

  1. 其它——windows提示缺少VCRUNTIME140.dll错误

    文章目录 一 原因 二 解决方法一 三 解决方法二 缺少了Microsoft.Net.Framework的安装 一 原因 最新在系统安装一些软件发现提示 这是因为缺少了一下windows运行需要的库 ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (112)-- 算法导论10.2 3题

    三.用go语言,用一个单链表L实现一个队列.要求操作 ENQUEUE 和 DEQUEUE 的运行时间仍为O(1). 文心一言: 在 Go 语言中,使用单链表实现队列的操作,包括入队(ENQUEUE)和 ...

  3. 16.2 ARP 主机探测技术

    ARP (Address Resolution Protocol,地址解析协议),是一种用于将 IP 地址转换为物理地址(MAC地址)的协议.它在 TCP/IP 协议栈中处于链路层,为了在局域网中能够 ...

  4. Dynamics CRM中自定义页面实现附件管理包含下载模板、上传、下载、删除

    前言 附件使用的Dynamics CRM平台本身的注释表annotation存储,将附件转换成二进制字节流保存到数据库中,因自带的注释在页面中显示附件不够直观,特做了一个单独的附件管理自定义页面,通过 ...

  5. 【Spring】AOP实现原理

    注册AOP代理创建器 在平时开发过程中,如果想开启AOP,一般会使用@EnableAspectJAutoProxy注解,这样在启动时,它会向Spring容器注册一个代理创建器用于创建代理对象,AOP使 ...

  6. java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符)

    报错信息:java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符) 解决方案:如下 1.file --> p ...

  7. python内置模块——logging

    内置模块-logging loging模块是python提供的内置模块,用来做日志处理. 日志等级: 等级 释义 级别数值 CRITICAL(fatal) 致命错误,程序根本跑不起来 50 ERROR ...

  8. poj3710 (无向图删边博弈)

    引入:树上删边博弈 例题:给出一个有 N个点的树,有一个点作为树的根节点.游戏者轮流从树中删去边,删去一条边后,不与根节点相连的部分将被移走.谁无法移动谁输. 结论:叶子节点的SG值为0:中间节点的S ...

  9. C#中的并行处理、并行查询的方法你用对了吗?

    Parallel.ForEach Parallel.ForEach 是一个用于在集合上并行执行迭代操作的强大工具.它通过有效地利用多核处理器的能力来提高性能.Parallel.ForEach 不仅能够 ...

  10. Guava Preconditions类的各种用法

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. Guava Preconditions类 提供静态方法列表,用于检查是否使用有效参数值调用方法或构造函数.如果前提条件失败 ...