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

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

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

相关文章

Day06-Mybatis

1. Mybatis介绍 2. Mybatis连接数据库并返回数据事例 连接oracle数据的设置方式 spring.application.namespringboot-mybatis spring.datasource.driver-class-nameoracle.jdbc.OracleDriver spring.datasource.urljdbc:oracle:thin:192.168.100.66:1521:orcl spring.datasour…

adb的常见操作和命令

最近学习adb的时候&#xff0c;整理了一些adb的使用场景&#xff0c;如&#xff1a;adb与设备交互&#xff0c;adb的安装、卸载&#xff0c;adb命令启动&#xff0c;通过命令清除缓存&#xff0c;文件传输和日志操作。 adb的两大作用&#xff1a;在app测试的时候可以提供监控日…

【头歌】计算机网络DHCP服务器配置第二关access口配置答案

头歌计算机网络DHCP服务器配置第二关access口配置操作步骤 任务描述 本关任务&#xff1a;创建 vlan &#xff0c;并且将与 pc 机相连接口划分 vlan 。 操作要求 在第一关的拓扑图的基础上&#xff0c;配置交换机&#xff0c;具体要求如下&#xff1a; 1、在特权模式下进入 vla…

Docker 快速更改容器的重启策略(Restart Policies)以及重启策略详解

目录 1. 使用 docker update 命令2. 在启动容器时指定重启策略3. 在 Docker Compose 文件中指定重启策略4. 总结 官方文档&#xff1a;Start containers automatically 1. 使用 docker update 命令 Docker 提供了 docker update 命令&#xff0c;可以在容器运行时更改其重启策…

Java基础:面向对象(二)

Java基础&#xff1a;面向对象&#xff08;二&#xff09; 文章目录 Java基础&#xff1a;面向对象&#xff08;二&#xff09;1. 面向对象编程思想2. 类与对象2.1 类2.1.1 类的定义2.1.2 成员变量2.1.3 局部变量 2.2 对象2.2.1 对象的定义2.2.2 对象的使用2.2.3 对象创建的原理…

DataGrip使用ssh连接数据库的操作流程

1 选择数据源种类 2 配置ssh 3 填写host、port和认证方式 我选择的密码方式&#xff0c;也可选择其他方式连接&#xff1a; 本文由博客一文多发平台 OpenWrite 发布&#xff01;

【放球问题】920. 播放列表的数量

本文涉及知识点 【组合数学 隔板法 容斥原理】放球问题 本题同解 【动态规划】【组合数学】【C算法】920播放列表的数量 LeetCode 920. 播放列表的数量 你的音乐播放器里有 n 首不同的歌&#xff0c;在旅途中&#xff0c;你计划听 goal 首歌&#xff08;不一定不同&#x…

释放 OSINT 的力量:在线调查综合指南

开源情报 (OSINT) 是从公开信息中提取有价值见解的艺术。无论您是网络安全专业人士、道德黑客还是情报分析师&#xff0c;OSINT 都能为您提供先进的技术&#xff0c;帮助您筛选海量的数字数据&#xff0c;发现隐藏的真相。 在本文中&#xff0c;我们将深入研究大量的OSINT 资源…

冯喜运:5.29市场避险情绪升温,黄金原油小幅收涨

【黄金消息面分析】&#xff1a;周二&#xff08;5月28日&#xff09;美盘时段&#xff0c;由于美元走弱且市场情绪出现负面变化&#xff0c;黄金收复早前跌幅&#xff0c;站上2350美元关口。金价早盘一度走弱&#xff0c;源于美联储降息可能性降低带来压力&#xff0c;投资者在…

AWS联网和内容分发之Transit Gateway

将Amazon VPC、AWS账户和本地网络连接到一个网关中。AWS Transit Gateway通过中央枢纽连接Amazon虚拟私有云&#xff08;VPC&#xff09;和本地网络。此连接简化了您的网络&#xff0c;并且结束了复杂的对等关系。Transit Gateway充当高度可扩展的云路由器&#xff0c;每个新的…

李廉洋:5.29黄金早盘2365-2345区间,今日行情走势分析及策略。

黄金消息面分析&#xff1a;当前美国存在一个令人担忧且未被充分关注的问题&#xff1a;房地产行业低迷、高利率和抵押贷款利率、租金高涨以及美联储的紧缩政策构成了一个恶性循环。由于高房价和高抵押贷款利率&#xff0c;美国住房经济活动远低于两年前的水平。为了让该行业好…

基于 RNNs 对 IMDB 电影评论进行情感分类

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

YiShaAdmin:一款基于.NET Core Web + Bootstrap的企业级快速开发框架

前言 今天大姚给大家分享一款基于.NET Core Web Bootstrap的企业级快速后台开发框架、权限管理系统&#xff0c;代码简单易懂、界面简洁美观&#xff08;基于MIT License开源&#xff0c;免费可商用&#xff09;&#xff1a;YiShaAdmin。 项目官方介绍 YiShaAdmin 基于.NET…

区间相交-435. 无重叠区间,56. 合并区间

题目连接及描述 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目分析 二维数组&#xff0c;数组中每个元素为大小为2的一维数组&#xff0c;求移除区间的最小数量&#xff0c;使剩余区间互不重叠。今天写…

数据结构之堆(优先级队列)

前言 在上一章我们讲了二叉树&#xff0c;这一节我们来讲堆&#xff08;优先级队列&#xff09;&#xff0c;所以想知道堆创建&#xff0c;可以看一下二叉树的一些简单概念。http://t.csdnimg.cn/4jUR6http://t.csdnimg.cn/4jUR6 目录 前言 堆 1.概念 2.优先级队列的模拟实…

1.2数学基础

向量运算 矩阵运算 比较基础就不记录了 MVP矩阵推导 1.讲为什么要有矩阵变换和不同的坐标空间 将3D物体转化到2D平面为各个空间的运用做准备 2.介绍各个空间的概念和含义 MVP矩阵代表什么&#xff1f; MVP矩阵分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。…

positivessl泛域名证书500元13个月

随着创建网站的门槛变低&#xff0c;不论是个人用户还是企事业单位用户创建的域名网站也越来越多&#xff0c;怎么维护网络环境的安全成为了各个用户需要解决的问题。为了保护网站的数据安全&#xff0c;防止恶意攻击和数据泄露&#xff0c;大多数用户选择为域名网站安装数字证…

水电智能抄表是什么?

1.简述&#xff1a;水电智能抄表的兴起 水电智能抄表系统是现代科学技术和传统公共文化服务相结合的产物&#xff0c;它通过自动化技术性改变了传统的人工抄表方式&#xff0c;大大提高了高效率&#xff0c;降低生产成本&#xff0c;同时也为用户提供了更为贴心的服务。这一新…

轻兔推荐 —— 一个好用的软件服务推荐平台

给大家推荐一个好用的的软件服务推荐平台&#xff1a;轻兔推荐 网站界面简洁大方&#xff0c;没有太多杂七杂八的功能和页面&#xff0c;有明暗主题色可以选择&#xff0c;默认为亮色&#xff0c;可在网站上方手动切换。 每工作日都会推荐一款软件&#xff0c;有时会加更&…

内网安全--隧道技术-MSF上线本地

免责声明:本文仅做技术交流与学习... 不得不说,小白最近也是用上了viper,这里要特别感谢一下my bro 北岭敲键盘的荒漠猫 MSF--viper: --生成马子-->上线 --进入meterpreter. 1-查看路由,添加路由. 查看路由信息 : run autoroute -p run post/multi/manage/autoroute 添加…