springboot使用@ConfigurationProperties自动绑定配置参数属性

@ConfigurationProperties使用

@ConfigurationProperties是 springboot提供用于将配置文件中的属性值映射到 Java bean对象上。通过使用该注解,我们可以方便地将属性文件中的值绑定到一个实例化的类对象上,从而方便地在应用程序中使用这些属性。

@ConfigurationProperties注解有一个参数prefix用来指定属性公共前缀

@Configuration
@ConfigurationProperties(prefix = "myconfig")
@Data
public class MyConfigProperty {private int port;//找不到的属性不会注入private String hhh;
}

一般作为属性注入对象,首先定义成一个@Configuration。然后使用@ConfigurationProperties指定关联属性的前缀。这样如果配置文件中有myconfig.port的值就会自动绑定到MyConfigProperty类的port属性上。前提要有对应的set方法。

除了在类上标注外,还可以在@Bean方法上

@Configuration
public class MyConfigByMethod {@Bean@ConfigurationProperties(prefix = "myconfig")public MyConfig myConfig(){return  new MyConfig();}
}

观察spring的源码,还会使用@EnableConfigurationProperties引入被@ConfigurationProperties修饰的bean

框架自动装配解析

在springboot框架自动装配中有一个内置的用来处理@ConfigurationProperties注解的配置类ConfigurationPropertiesAutoConfiguration,该配置类引入@EnableConfigurationProperties,然后间接引入EnableConfigurationPropertiesRegistrar,EnableConfigurationPropertiesRegistrar在configuration初始化的时候会调用其registerBeanDefinitions()方法进行配置类中扩展beanDef的加载。

EnableConfigurationPropertiesRegistrar#registerBeanDefinitions

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {registerInfrastructureBeans(registry);registerMethodValidationExcludeFilter(registry);ConfigurationPropertiesBeanRegistrar beanRegistrar = new ConfigurationPropertiesBeanRegistrar(registry);getTypes(metadata).forEach(beanRegistrar::register);}private Set<Class<?>> getTypes(AnnotationMetadata metadata) {return metadata.getAnnotations().stream(EnableConfigurationProperties.class).flatMap((annotation) -> Arrays.stream(annotation.getClassArray(MergedAnnotation.VALUE))).filter((type) -> void.class != type).collect(Collectors.toSet());
}
static void registerInfrastructureBeans(BeanDefinitionRegistry registry) {ConfigurationPropertiesBindingPostProcessor.register(registry);BoundConfigurationProperties.register(registry);
}

这里主要会完成两件事件:

1、registerInfrastructureBeans会将ConfigurationPropertiesBindingPostProcessor注册到容器中,这是一个后置处理其,属性的赋值会在其后置方法里完成。

2、注册合适的ConfigurationProperties类型bean, 当前metadata是正在初始化的Configuration类,然后从其注解上获取带有EnableConfigurationProperties注解作为bean定义加载到容器中。

来看几个自动装配的例子:

ServletWebServerFactoryAutoConfiguration

ServletWebServerFactoryAutoConfiguration上带有@EnableConfigurationProperties(ServerProperties.class)注解,则ServerProperties会作为一个bean进行处理。ServerProperties上配置有@ConfigurationProperties(prefix = “server”, ignoreUnknownFields = true),我们场景的server.port属性就会注入到ServerProperties.port属性上。

DataSourceAutoConfiguration

@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {}@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties{}

DataSourceProperties会被做为一个bean加载,"spring.datasource"下的属性会注入到DataSourceProperties属性中。

ConfigurationPropertiesBindingPostProcessor

ConfigurationPropertiesBindingPostProcessor是一个bean后置处理器,在bean实例化后会调用其后置方法

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {bind(ConfigurationPropertiesBean.get(this.applicationContext, bean, beanName));return bean;
}

ConfigurationPropertiesBean.get()方法会判断当前bean是否有ConfigurationProperties注解,如果有会进行对应的属性绑定。最后使用org.springframework.boot.context.properties.bind.Binder类进行属性绑定。这里ConfigurationProperties会有两部分,一是框架通过autoConfig自动装配的,一种是我们自己显示使用@ConfigurationProperties修饰的bean。这里看到我们在自定义@ConfigurationProperties时候不一定非用@Configuration进行修饰,只要当前类能被解析成一个bean,都会调用该后置方法进行对应配置属性的赋值。

属性元数据信息

可配置的属性在每个jar包META-INFO/spring-configuration-metadata.json文件。这样一般在IDEA配置application文件时候都能根据该文件里的元数据信息进行提示配置。

例如server.port配置在spring-boot-autoconfigure.jar包中

{"name": "server.port","type": "java.lang.Integer","description": "Server HTTP port.","sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties","defaultValue": 8080
},

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

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

相关文章

无缝衔接,完美对接:探索系统对接的最佳实践

目录 1、前言 2、系统对接概述 2.1 什么是系统对接 2.2 系统对接的重要性 3、系统对接注意事项 4、系统对接的最佳实践 5、系统对接的风险和解决方案 5.1 数据安全风险 5.2 兼容性风险 5.3 故障和错误处理 6、结语 1、前言 随着科技的不断进步和应用场景的不断拓展…

Python 自学(四) 之元组字典与集合

目录 1. 列表&#xff0c;元组&#xff0c;字典与集合的区别 2. 元组的创建和删除 tuple() del P101 3. 单个元素的元组 P102 4. 元组元素的修改 P106 5. 元组的使用场景 6. 字典的创建和删除 dict() zip() : del clear() P1…

使用setcap修改Linux程序CAP能力值

Linux是一种安全操作系统&#xff0c;它给普通用户尽可能低的权限&#xff0c;而把全部的系统权限赋予一个单一的帐户--root。root帐户用来管理系统、安装软件、管理帐户、运行某些服务、安装/卸载文件系统、管理用户、安装软件等。另外&#xff0c;普通用户的很多操作也需要ro…

Transformer 架构解释

一、说明 变形金刚是机器学习的一个新发展&#xff0c;最近引起了很大的轰动。他们非常善于跟踪上下文&#xff0c;这就是为什么他们写的文本有意义。在本章中&#xff0c;我们将介绍它们的体系结构以及它们的工作原理。 amanatulla1606 Transformer 模型是机器学习中最令人兴奋…

点击出现视频弹框

<VideoPlayer ref"video":size"{ width: 88%, height: 100% }" :videoSrc"currentVideo.url"></VideoPlayer>import VideoPlayer from /components/video-player.vue

Cad怎么绘制齿轮模型?

CAD怎么绘制齿轮模型&#xff1f;cad中想要绘制一个锯齿形状&#xff0c;该怎么绘制呢&#xff1f;学会cad怎么画齿轮是必不可少的&#xff0c;下面我们就来看看使用cad齿轮的画法。 1、cad齿轮画法很简单&#xff0c;首先打开cad正交模式&#xff0c;并打开cad的圆心捕捉、最…

java String输出GB2312编码格式到文件

import java.io.*;public class GB2312Output {public static void main(String[] args) {try {// 创建文件输出流FileOutputStream fos new FileOutputStream("output.txt");// 创建GB2312编码的输出流写入器OutputStreamWriter osw new OutputStreamWriter(fos, …

护眼台灯值得买吗?如何选购护眼台灯?2024年护眼台灯排行榜

作为在护眼行业摸爬滚打几年的好老司机&#xff0c;我对护眼台灯产品自然不陌生&#xff0c;护眼台灯也是很早之前就在使用&#xff0c;对于它的技术参数、原理、功能等可以说是非常熟悉。 现在护眼台灯普遍出现在孩子们的书桌上&#xff0c;在孩子深夜学习时&#xff0c;挑起…

打地鼠python程序设计说明,打地鼠游戏界面设计

这篇文章主要介绍了打地鼠python程序设计说明&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 Pygame库是专门为了帮助做出的游戏和其他多媒体应用Python编程语言的一个开放源代…

ORACLE Primavera Unifier v23.12 最新虚拟机(VM)分享下载

引言 根据上周的计划&#xff0c;我近日简单制作了一个基于ORACLE Primavera Unifier 最新版23.12的虚拟机演示环境&#xff0c;里面包括了unifier的全套系统服务 此虚拟系统环境仅用于演示、培训和测试目的。如要在生产环境中使用此虚拟机&#xff0c;请您与Oracle 销售代表联…

灵芝,到2025年有望达到9.2亿美元

灵芝是一种传统的药食两用菌&#xff0c;其具有丰富的营养成分和医疗价值&#xff0c;因此备受关注。全球市场分析 从全球市场来看&#xff0c;近年来灵芝的市场需求持续增长。据估计&#xff0c;2019年全球灵芝市场规模为4.1亿美元&#xff0c;到2025年有望达到9.2亿美元。市场…

Django定制模型管理器

objects是检索数据库中所有对象的每个模型的默认管理器。然而&#xff0c;也可以为我们的模型定义自定义管理器。 比如创建一个自定义管理器来检索具有发布状态的所有帖子。关于blog的模型&#xff0c;可以参考 Django数据模型代码片段-CSDN博客 &#x1f4cc;使用Post.publi…

Python中Selenium模块的使用详解

Selenium的介绍、配置和调用 Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Firefox&#xff0c;Safari&a…

【C语言】字符串 和 ctype.h 中的函数 练习

前面总结了有关字符串和ctype.h的文章&#xff0c;接下来就以几个例子来练习一下&#xff0c;以巩固之前的基础概念。注意&#xff1a;以下示例都有更简单更高效的解决方法&#xff0c;但本次仅以巩固基础为目的&#xff0c;所以方法可能稍作繁琐 Leetcode 344.反转字符串 编…

【第5期】前端Vue使用Proxy+Vuex(store、mutations、actions)跨域调通本地后端接口

本期简介 本期要点 本地开发前后端如何跨域调用全局请求、响应处理拦截器处理封装HTTP请求模块编写API请求映射到后端API数据的状态管理 一、 本地开发前后端如何跨域调用 众所周知&#xff0c;只要前端和后端的域名或端口不一样&#xff0c;就存在跨域访问&#xff0c;例如&…

数模学习day07-基于熵权法对Topsis模型的修正

初步理解 这里看看就好 熵权法是一种常用的多指标综合评价方法&#xff0c;通过计算指标的熵值来确定各指标的权重。而Topsis模型则是一种常用的多指标决策模型&#xff0c;用于评估不同方案的优劣。 在基于熵权法的Topsis模型中&#xff0c;可以对熵权法进行一些修正来提高模型…

在word文档中自制代码段样式

附&#xff1a; 在word中插入高亮代码的网站 HighlightCode&#xff1a;https://highlightcode.com/ CodeInWord&#xff1a;http://codeinword.com/ 一、新建代码段样式 点击下拉按钮&#xff0c;选择创建样式&#xff0c;命名为代码段&#xff0c;然后点击修改 点击格式&a…

【Linux驱动】Linux中断(二)—— 按键中断驱动

前一篇已经在设备树的 gpio-led 节点中引入了中断信息&#xff0c;接下来将通过API来获取设备树中的中断信息。gpio-led 节点具体内容如下&#xff1a; gpio-key0 {pinctrl-names "default";pinctrl-0 <&pinctrl_gpio_keys>; // pinctrl子系…

html引入ECharts的两种方式

第一种方式&#xff1a; 本地引入 <!DOCTYPE html> <html> <head><meta charset"utf-8"><!-- 引入 ECharts 文件 --><script src"echarts.min.js"></script> </head> </html> 第二种方式&#x…

linux性能优化

文章目录 性能优化图CPU进程和cpu原理性能指标 性能优化图 CPU 进程和cpu原理 进程与线程&#xff1a; 进程是程序的执行实例&#xff0c;有自己的地址空间和系统资源。线程是进程内的执行单元&#xff0c;共享进程的资源。在多核系统中&#xff0c;使用多线程可以更好地利用多…