首页 > 编程语言 >Spring源码学习笔记4——BeanFactoryPostProcessor执行

Spring源码学习笔记4——BeanFactoryPostProcessor执行

时间:2022-08-21 11:33:59浏览次数:61  
标签:调用 1.2 Spring BeanFactoryPostProcessor bean 源码 PriorityOrdered BeanDefinitionReg

一丶BeanFactoryPostProcessor是什么

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

image-20220523154934558

可以做自定义的调整BeanDefinition等等操作,

二丶BeanDefinitionRegistryPostProcessor

实现了BeanFactoryPostProcessor 也是一个扩展接口,提供一个新的方法

image-20220523155935306

但是这个方法入参是BeanDefinitionRegistry 不是BeanFactory

三丶BeanFactoryPostProcessor的调用时机与逻辑

image-20220523185149305

重点在invokeBeanFactoryPostProcessors 方法中

image-20220523185411765

除非我们自己实现一个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注解)

image-20220523203043960

注意这里还只调用了实现PriorityOrdered的BeanDefinitionRegistryPostProcessor,后续调用其他的BeanDefinitionRegistryPostProcessor,没有表明顺序的最后调用,调用的过程很简单,就是循环执行

1.3 调用BeanFactoryPostProcessor的postProcessBeanFactory 方法

流程类似于1.2,区别在于这里还会调用BeanDefinitionRegistryPostProcessor 的postProcessBeanFactory

四丶比较重要的实现

image-20220523155807561

1.PropertyResourceConfigurer

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

image-20220523210228547

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

image-20220523210732667

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设置解析前缀,后缀,和默认值分割符,以及是否裁剪,和默认的空值

image-20220523231612747

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

image-20220523231955167

2.ConfigurationClassPostProcessor

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

这个类相当复杂,后续单独学习以下

标签:调用,1.2,Spring,BeanFactoryPostProcessor,bean,源码,PriorityOrdered,BeanDefinitionReg
From: https://www.cnblogs.com/cuzzz/p/16609677.html

相关文章

  • 新建Springboot项目默认test包下的测试类报错缺少org.junit.jupiter.api
    参考CSDN博客链接:https://blog.csdn.net/weixin_39764056/article/details/104402593本人使用IDEA新建了一个Springboot项目,然后导入了spring-boot-start-test依赖,该项目......
  • Spring源码学习笔记6——Spring bean的实例化
    一丶前言前面我们了解到读取xmlor根据扫描路径生成BeanDefinition并注册到BeanFactory,相当于我们具备了生火做饭的原材料:BeanDefinition,接下来就是Spring最为核心的,根据......
  • SpringBoot框架:配置项目在访问后台端口时默认跳转的接口或页面
    一、配置一般需要这种配置的都是前后端一体的项目,在通过后台端口访问时需要默认跳转到某个指定的接口,或者跳转到某个执行的接口。实现WebMvcConfigurer接口,重写a......
  • Tomcat源码分析--类加载器
    Tomcat类加载器结构上图是Tomcat文档中所展示的Tomcat类加载结构。在这个结构中Bootstartap和System的类加载器由java虚拟机实现。common类加载器由Tomcat容器实现,它对......
  • 第一个Spring Boot项目
    上一节学习了通过Spring官网创建SpringBoot项目,导入了一个demo项目,但是没有写代码运行,这一节就来学习一下怎么运行。1、首先在demo文件夹下创建一个controller包,再创建一......
  • SpringBoot--嵌入式Servlet容器
    一、嵌入式Servlet容器在传统的Web开发中,需要将项目打成war包,在外部配置部署好Tomcat服务器,而这个Tomcat就是Servlet容器,在使用SpringBoot开发时,我们无需再外部......
  • Spring 04: IOC控制反转 + DI依赖注入
    Spring中的IOC一种思想,两种实现方式IOC(InversionofControl):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入核心业务:(a)对象的创建(b)依赖的......
  • SpringBoot--静态资源映射处理
    在web开发中,静态资源的访问是必不可少的,如图片、js、css等资源的访问SpringBoot对静态资源访问提供了很好的支持,基本使用默认配置就能满足开发需求(嵌入式servlet容器)先......
  • Vulfocus靶场 | spring 代码执行 (CVE-2018-1273)
    漏洞描述SpringData是一个用于简化数据库访问,并支持云服务的开源框架,SpringDataCommons是SpringData下所有子项目共享的基础框架。SpringDataCommons在2.0.5及以......
  • springMvc32-原生apiSpring MVC过滤器-HiddenHttpMethodFilter
    浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求,该过......