@EnableConfigurationProperties源码解析

news2024/9/24 9:28:15

前言

@EnableConfigurationProperties注解的使用,请移步相关博文:@EnableConfigurationProperties注解使用

前置知识

@Import注解作用简述

注入的类一般继承 ImportSelector 或者 ImportBeanDefinitionRegistrar 接口

  • 继承ImportSelector接口:会在解析阶段执行 selectImports 方法,方法返回的类名数组,会被实例化成指定类型的Bean
  • 继承ImportBeanDefinitionRegistrar接口:会在解析阶段执行 registerBeanDefinitions 方法

BeanDefinition

BeanDefinition是bean的建模对象,Spring根据BeanDefinition设置的相关属性实例化Bean,实例化bean的方式及优先级如下:

  1. 通过 supplier 创建
  2. 通过 factoryMethod 创建
  3. 其他 (默认构造方法、指定构造方法等)

详情请移步相关博文 : Spring之BeanDefinition

源码解析

@EnableConfigurationProperties注解源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EnableConfigurationPropertiesRegistrar.class)
public @interface EnableConfigurationProperties {

	/**
	 * The bean name of the configuration properties validator.
	 * @since 2.2.0
	 */
	String VALIDATOR_BEAN_NAME = "configurationPropertiesValidator";

	/**
	 * Convenient way to quickly register
	 * {@link ConfigurationProperties @ConfigurationProperties} annotated beans with
	 * Spring. Standard Spring Beans will also be scanned regardless of this value.
	 * @return {@code @ConfigurationProperties} annotated beans to register
	 */
	Class<?>[] value() default {};

}

综上所述,Spring会在解析阶段执行 EnableConfigurationPropertiesRegistrar 的 registerBeanDefinitions 方法。

registerBeanDefinitions

  1. registerInfrastructureBeans
  2. registerMethodValidationExcludeFilter
  3. ConfigurationPropertiesBeanRegistrar#register
registerInfrastructureBeans

ConfigurationPropertiesBindingPostProcessor.register

如果BeanFactory中不存在一个名称为 org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor的 BeanDefinition,则注册一个名称为 org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor,类型为 ConfigurationPropertiesBindingPostProcessor.class 的 BeanDefinition

ConfigurationPropertiesBinder.register

如果BeanFactory中不存在一个名称为 org.springframework.boot.context.internalConfigurationPropertiesBinderFactory 的 BeanDefinition,则注册一个名称为 org.springframework.boot.context.internalConfigurationPropertiesBinderFactory,类型为 ConfigurationPropertiesBinder.Factory.class 的BeanDefinition

如果BeanFactory中不存在一个名称为 org.springframework.boot.context.internalConfigurationPropertiesBinder 的 BeanDefinition,则注册一个名称为 org.springframework.boot.context.internalConfigurationPropertiesBinder,InstanceSupplier 为 ConfigurationPropertiesBinder.Factory.class 的 create 方法的 BeanDefinition

registerInfrastructureBeans方法小结

registerInfrastructureBeans方法最终会注册三个BeanDefinition,名称分别为:

  1. org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
  2.  org.springframework.boot.context.internalConfigurationPropertiesBinderFactory
  3. org.springframework.boot.context.internalConfigurationPropertiesBinder
registerMethodValidationExcludeFilter

如果BeanFactory中不存在一个名称为 org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.methodValidationExcludeFilter 的 BeanDefinition,则注册一个名称为 org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.methodValidationExcludeFilter,InstanceSupplier 为 MethodValidationExcludeFilter.byAnnotation(ConfigurationProperties.class) 的 BeanDefinition

ConfigurationPropertiesBeanRegistrar#register

如果@EnableConfigurationProperties注解配置了value属性,SpringBoot会以类的全限定名为名称,以value指定的类型为BeanClass构建BeanDefinition对象并注册到Spring中。如果value属性指定类的构造方法存在 @ConstructorBinding 注解,则以指定构造方法实例化对象。

registerBeanDefinitions方法小结

registerBeanDefinitions方法内部有多个方法调用,默认情况下,registerInfrastructureBeans方法会注册三个BeanDefinition,registerMethodValidationExcludeFilter 方法会注册一个BeanDefinition。如果 @EnableConfigurationProperties 注解指定了value,还会额外注册多个BeanDefinition。我们需要注意的是registerInfrastructureBeans方法注册的三个BeanDefinition,其中一个类型是 ConfigurationPropertiesBindingPostProcessor,这是一个BeanPostProcessor,默认情况下的属性绑定都是通过其 postProcessBeforeInitialization 方法完成的。由上述理论,我们可以得出以下结论:

  • @EnableConfigurationProperties指定value
    • @EnableConfigurationProperties + @ConfigurationProperties 完成属性绑定 (已手动注册相关BeanDefinition)
      • 存在 @ConstructorBinding 注解标记的构造方法
        • 以指定构造方法实例化对象
      • 不存在 @ConstructorBinding 注解标记的构造方法
        • 以默认构造方法实例化对象
  • @EnableConfigurationProperties未指定value
    • @EnableConfigurationProperties + @ConfigurationProperties + @Component 完成属性绑定 (需要添加@Component注解被扫描解析成BeanDefinition)
      • 以默认构造方法实例化对象​​​​​​​​​​​​​​​​​​​​​

​​​​​​​​​​​​​​​​​​​​​属性绑定

以默认构造方法实例化对象

通过 ConfigurationPropertiesBindingPostProcessor 的 postProcessBeforeInitialization 方法绑定属性

以指定构造方法实例化对象

通过 ConfigurationPropertiesBeanRegistrar 的 createValueObject 方法绑定属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1706372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑龙江某市数字孪生地下水监测系统平台项目建设经验

项目背景 地下水是一种特殊而珍贵的资源&#xff0c;它具有不可替代性&#xff0c;与经济发展及人民生活息息相关&#xff0c;针对日趋严峻的水资源危机&#xff0c;如何合理利用有限的水资源&#xff0c;保障国民经济的可持续发展是一个迫切需要解决的问题。 黑龙江某市积极…

SpringMvc-restful设计风格

Restful 1、入门1.1 简介1.2 实例 1、入门 1.1 简介 RESTFul是什么 RESTFul是WEB服务接口的一种设计风格。 RESTFul定义了一组约束条件和规范&#xff0c;可以让WEB服务接口更加简洁、易于理解、易于扩展、安全可靠。 1.2 实例 web.xml <?xml version"1.0"…

系统测试需求指南(Word版-软件全套资料下载)

1 目的 2 概述 3 测试需求 3.1 测试范围 3.2 测试目标 4 测试需求的现状 5 测试需求的内容 5.1 主体内容 5.2 管理内容 6 测试需求的制定 6.1 需求信息来源 6.2 需求分析 6.2.1 功能性需求 6.2.2 系统功能需求 6.2.3 界面需求 6.2.4 安装需求 6.2.5 业务需求 …

教师信息素养四个方面是什么

在这个信息爆炸的时代&#xff0c;老师们该如何提升自己的信息素养&#xff1f;信息素养&#xff0c;这个看似简单的概念&#xff0c;实际上包含着丰富的内涵和多维度的技能。它不仅仅是获取信息的能力&#xff0c;更是一种综合运用信息资源&#xff0c;解决教学和生活中问题的…

gRPC 状态码解读:一文看懂

gRPC 是什么&#xff1f; gRPC&#xff08;gRPC Remote Procedure Call&#xff09;是一个高性能的开源框架&#xff0c;它通过远程过程调用&#xff08;RPC&#xff09;机制促进应用程序之间的通信。 gRPC 框架使客户端应用程序能够调用不同机器上的服务器应用程序的方法&am…

零拷贝(Zero Copy)

目录 零拷贝&#xff08;Zero Copy&#xff09; 1.什么是Zero Copy? 2.物理内存和虚拟内存 3.内核空间和用户空间 4.Linux的I/O读写方式 4.1 I/O中断原理 4.2 DMA传输原理 5.传统I/O方式 5.1传统读操作 5.2传统写操作 6.零拷贝 6.1.用户态直接IO 6.2.mmapwrite …

计算机图形学入门02:线性代数基础

1.向量&#xff08;Vetors&#xff09; 向量表示一个方向&#xff0c;还能表示长度&#xff08;向量的摸&#xff09;。一般使用单位向量表示方向。 向量加减&#xff1a;平行四边形法则、三角形法则。比卡尔坐标系描述向量&#xff0c;坐标直接相加。 1.1向量点乘&#xff08;…

帆软报表点击表格给数据集传递参数案例

一、效果 有四个模块&#xff0c;分别是采购总金额&#xff0c;采购总数量&#xff0c;采购合同数量&#xff0c;采购合同申请数量通过点击单元格上的月份&#xff0c;展示不同的月份数据&#xff0c;进行单元格和表格之间的联动 二、准备好数据库表和展示数据内容 2.1 建表 …

英语四级翻译练习笔记③——大学英语四级考试2023年12月真题(第三套)

目录 引言&#xff08;必看&#xff09; 四级翻译评分标准分析及真题解析 四级翻译评分标准 四级翻译真题 学生作答 1. 评分 2. 修正翻译中的错误 错误标记&#xff1a; 3. 改正句子 4. 标出错误单词 5. 标准答案 6. 常考万能句子 7.重点单词的中文意思 引言&…

Excel未响应时强关后,Excel插件消失

目录 我们分析一下插件消失的原因&#xff1a; 针对上面表现出来的2个问题&#xff0c;进行针对性的解决 &#xff1a; 1、不被关进去&#xff0c;是不是就没有后续的一系列的问题了&#xff0c;各自安好 2、保留住自动加载的行为 PS&#xff1a;配置受信任的位置注册列表…

【K8s】专题四(1):Kubernetes 控制器简介

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、基本概念 二、工作原理 三、常见类型 四、相关特性 一、基本概念 Kubernetes 控制器…

Python考试练习题---day1

1.计算2的n次幂结果的后3位 获得用户输入的一个数字N&#xff0c;计算并输出2的N次幂结果的后3位。 【输出样例】-----因为2的10次方等于1024 输入10输出024 ninput() print(str(2**eval(n))[-3:]) 2.分割四位正整数 例1&#xff1a; 编写程序&#xff0c;提示用户从键盘…

[Redis]String类型

基本命令 set命令 将 string 类型的 value 设置到 key 中。如果 key 之前存在&#xff0c;则覆盖&#xff0c;无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。 set key value [expiration EX seconds|PX milliseconds] [NX|XX] 选项[EX|PX] EX seconds⸺使用…

vscode+docker搭建迷你开发环境。制作docker镜像,并通过vscode连接后进行开发

制作自己的docker镜像&#xff0c;将docker镜像作为服务器&#xff0c;接受vscode连接 目录 1. 制作开发环境镜像 1.1 选择基础镜像 1.2 编写dockerfile 1.3 构建镜像 2. 启动镜像 3. 添加用户 3.1 查看物理机上用户信息 3.2 登录到docker中 3.3 按照物理机的用户和组…

在visual studio 2022中编译yaml-cpp 32位静态库的严重踩坑问题解决过程

使用vcpkg 引入yaml-cpp把程序调试好了,但是分发的时候不想带着yaml-cpp的动态链接库文件,所以参考网上的文章想进行程序的静态编译,关于如何编译yaml-cpp的静态库网上有很多文章,而且去看yaml-cpp的github官方说明文件人家说你啥都不干就是默认编译为静态库了,好家伙,兴…

MySQL主从复制故障:“ Slave_SQL_Running:No“ 两种解决办法

问题 今天搭建MySQL的主从复制&#xff0c;查看从机状态时show slave status\G&#xff0c;发现这个参数为NO&#xff0c;导致主从复制失败。 Slave_SQL_Running: No 后面上网查阅了一下资料&#xff0c;大概就是因为在连接支持数据库后&#xff0c;也就是这个命令后&#xff…

Python 应用开发:Streamlit 布局篇(容器布局)

st.columns 以并列方式插入容器。 插入若干并排排列的多元素容器&#xff0c;并返回一个容器对象列表。 要在返回的容器中添加元素&#xff0c;可以使用 with 符号&#xff08;首选&#xff09;或直接调用返回对象的方法。请参见下面的示例。 列只能放置在其他列的内部&…

word如何创造新的格式标题

1 效果如下&#xff1a;&#xff08;标题命名默认音序排序&#xff09; 2 创建 选中自己喜欢的标题&#xff0c;修改字号字体&#xff0c;then 3 修改 注意要点如下&#xff1a; 后续&#xff1a;以上操作可能导致后续一级标题不能折叠二级标题&#xff0c;目录导航栏也不能…

QListWidget详解

QListWidget详解 QListWidget 是 PyQt5 中一个方便的部件&#xff0c;用于创建和管理列表。它继承自 QListView&#xff0c;并提供了一些高级功能&#xff0c;使得添加和管理列表项更加简单。以下是 QListWidget 的详解&#xff0c;包括基本用法、主要方法和属性以及如何与其他…

张驰咨询:六西格玛培训,IT界的“福尔摩斯”

六西格玛&#xff0c;这个曾以制造业为背景的管理理念&#xff0c;如今却在IT领域大放异彩。其背后的原因&#xff0c;不仅仅是因为六西格玛追求零缺陷、持续改进的核心价值观与IT行业对产品质量和用户体验的极致追求不谋而合&#xff0c;更是因为它提供了一种全新的思维方式和…