@EnableConfigurationProperties源码解析

前言

@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 方法绑定属性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AIGC 人工智能全能实操课:用AI工作,提升效率,帮你赚钱(33节课)

课程目录 2-AIGC介绍先导1.mp4 3-第一节-chatGPT介绍与原理1.mp4 4-第二节-CHATGPT提示词的三个原则_1.mp4 5-第三节-chatgpt提示词的7个步骤1.mp4 6-第四节-chatgpt提示词的4个技巧1.mp4 7-第五节-chatgpt制作分镜案例分享1.mp4 8-第六节-chatgpt提示词生成工具1.mp4 …

最短路Dijkstra求最短路(讲解 + 模板 + 例题)

Dijkstra算法 Dijkstra是基于贪心思想的单源最短路算法; 变量定义 : const int N 510; const int INF 1e9 10 ; struct edge{int v , w ; // 表示出边和边权 }; vector<edge> e[N] ; int d[N] ; // dis[u]存u到源点s的最短距离 int vis[N] ;// vis[u]标记u是否…

K8s集群调度续章

目录 一、污点&#xff08;Taint&#xff09; 1、污点&#xff08;Taint&#xff09; 2、污点组成格式 3、当前taint effect支持如下三个选项&#xff1a; 4、查看node节点上的污点 5、设置污点 6、清除污点 7、示例一 查看pod状态&#xff0c;模拟驱逐node02上的pod …

选择快充时代下的理想充电器与电压诱骗芯片PW6606

随着科技的不断进步&#xff0c;我们的电子设备对于充电速度和效率的要求越来越高。在快充技术迅猛发展的今天&#xff0c;了解不同类型的充电器及其对应的快充协议&#xff0c;以及如何选择适合的电压诱骗芯片&#xff0c;对于提升充电体验和保障设备安全显得尤为重要。 一、快…

「代码厨房大揭秘:Python性能优化的烹饪秘籍!」

哈喽&#xff0c;我是阿佑&#xff0c;上篇咱们讲了 Socket 编程 —— 探索Python Socket编程&#xff0c;赋予你的网络应用隐形斗篷般的超能力&#xff01;从基础到实战&#xff0c;构建安全的聊天室和HTTP服务器&#xff0c;成为网络世界的守护者。加入我们&#xff0c;一起揭…

什么情况下JVM内存中的一个对象会被垃圾回收?

什么情况下JVM内存中的一个对象会被垃圾回收? 1、什么时候会触发垃圾回收?2、被哪些变量引用的对象是不能回收的?3、Java中对象不同的引用类型4、finalize()方法的作用1、什么时候会触发垃圾回收? 平时我们系统运行创建的对象都是优先分配在新生代里的,如图: 然后如果…

【JVM底层原理,JVM架构详解】

1. JVM简介 1.1 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 主流虚拟机: 虚拟机名称介绍HotSpotOracle/Sun JDK和OpenJDK都使用HotSPo…

【算法】位运算算法——丢失的数字

题解&#xff1a;丢失的数字(位运算算法) 目录 1.题目2.题解3.位运算异或4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 哈希数组查漏高斯求和排序位运算异或… 3.位运算异或 class Solution { public:int missingNumber(vector<int>& nums) {int ret 0;for…

单调栈--

1.每日温度 那么单调栈的原理是什么呢&#xff1f;为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢&#xff1f; 单调栈的本质是空间换时间&#xff0c;因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素&#xff0c;优点是整个数…

使用大模型LLM实现销售AI

想象一个场景&#xff0c;客户通过聊天窗口咨询一款产品。销售AI首先使用LLM解析客户的问题&#xff0c;然后通过智能代理查询数据库获取产品详细信息&#xff0c;并以自然而友好的方式回应客户。 在对话过程中&#xff0c;AI可以评估客户的兴趣&#xff0c;并主动提供促销信息…

【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)

&#x1f50d;目的 允许派生组件从与派生类型兼容的基本组件继承某些功能。 &#x1f50d;解释 真实世界例子 对于正在策划赛事的综合格斗推广活动来说&#xff0c;确保在相同重量级的运动员之间组织比赛至关重要。这样可以防止体型明显不同的拳手之间的不匹配&#xff0c;例如…

Linux——多线程(一)

一、线程的概念 1.1线程概念 教材中的概念&#xff1a; (有问题?) 线程是进程内部的一个执行分支&#xff0c;线程是CPU调度的基本单位 之前我们讲的进程&#xff1a; 加载到内存中的程序&#x…

云易办springboot+vue后端

springbootvue云易办后端项目完成 一.创建项目 创建父项目&#xff1a;yeb&#xff0c; 使用spring Initializr&#xff0c;完成创建之后删除无用文件夹&#xff0c;作为父项目 添加packaging <packaging>pom</packaging>二.创建子模块&#xff1a;yeb-server …

PyCharm基本配置内容

如何更换 Python 解释器 输入一段代码点击运行后&#xff0c;画面下方有一个路径如图中框中所示&#xff1a; 上面的路径为虚拟路径&#xff0c;可以改为我们自己设置的路径 点击设置&#xff0c;选择settings 选择Project&#xff1a;y002———》Python Interpreter&#…

Clickhouse 嵌套数据类型总结—— Clickhouse 基础篇(三)

文章目录 创建嵌套类型的表插入读取数据在嵌套类型上使用数组函数 在 clickhouse 中存储嵌套类型的关键字是 Nested, 只支持一级嵌套。数据结构类似于在数据结构类似于在表的单元格里面嵌套“一张表格”&#xff0c;如下图所示&#xff1a; 嵌套类型是列存储&#xff0c;本质…

OWASP十大API漏洞解析:如何抵御Bot攻击?

新型数字经济中&#xff0c;API是物联网设备、Web和移动应用以及业务合作伙伴流程的入口点。然而&#xff0c;API也是犯罪分子的前门&#xff0c;许多人依靠Bot来发动攻击。对于安全团队来说&#xff0c;保护API并缓解Bot攻击至关重要。那么Bot在API攻击中处于怎样的地位&#…

【JVM】一次JVM内存泄露分析处理

一次内存泄露分析 背景情况 编写了一个大数据基础组件的可用性监控程序&#xff0c;采用Bootstrap监测端口的方式&#xff0c;使得方法常驻&#xff08;main线程常驻&#xff09;&#xff0c;通过一个调度线程ScheduledThreadPoolExecutor&#xff0c;定时的调动监测任务。 …

OTFS系统建模、通信性能分析、信道估计、模糊函数【附MATLAB代码】

文献来源&#xff1a;​微信公众号&#xff1a;EW Frontier OTFS简介 OTFS信道估计 % Clear command window, workspace variables, and close all figures clc; clear all; close all; ​ % Define Eb values in dB EbdB -10:2:10; ​ % Convert Eb values from dB to lin…

微软提出“Copilot+ PCs”构想,强调本地AI处理;OpenAI暂停ChatGPT语音功能因声音相似争议

&#x1f989; AI新闻 &#x1f680; 微软提出“Copilot PCs”构想&#xff0c;强调本地AI处理 摘要&#xff1a;在微软 Build 开发者前瞻大会上&#xff0c;CEO 萨蒂亚・纳德拉介绍了“Copilot PCs”&#xff0c;一种新类 Windows PC&#xff0c;需配备神经处理单元&#xf…

视频技术在智慧营业厅中的应用:AI识别与智能化转型

一、方案背景 随着信息技术的快速发展&#xff0c;图像和视频分析技术已广泛应用于各行各业&#xff0c;特别是在营业厅场景中&#xff0c;该技术能够有效提升服务质量、优化客户体验&#xff0c;并提高安全保障水平。TSINGSEE青犀智慧营业厅视频管理方案旨在探讨视频监控和视…