【@ConfigurationProperties注解的用处】

介绍

@ConfigurationProperties 是 Spring 框架中的一个注解,用于将配置文件中的属性映射到 Java 对象的字段上。它的主要用途是简化配置文件与 Java 对象之间的映射过程,使得配置更加方便、可读,并提供类型安全的属性访问。

用途和特性

  • 属性映射: 将配置文件中的属性映射到 Java 对象的字段上。这样,可以通过在 Java 类中定义字段来组织和访问应用程序的配置。

  • 类型安全: 通过在 Java 类型上使用注解,可以实现类型安全的属性访问。如果配置文件中的属性与 Java 类型不匹配,Spring 在启动时会报错,提前发现配置错误。

  • 嵌套属性: 支持将配置文件中的属性嵌套到 Java 对象的嵌套字段中,使得可以更结构化地组织配置信息。

  • 多环境支持: 可以通过在注解中指定 prefix 属性,将不同环境下的配置信息分组,从而实现多环境配置。

  • 默认值: 可以为字段设置默认值,如果配置文件中没有相应的属性,将使用默认值。

  • 动态刷新: 在 Spring Boot 中,@ConfigurationProperties 还支持动态刷新,当配置发生变化时,可以通过 @RefreshScope 注解实现动态刷新,而不需要重启应用程序。

  • 属性验证: 可以使用 @Validated 注解结合 JSR 303 标准的验证注解,对配置属性进行验证。

示例如下:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {private String appName;private int maxConnections;// other properties...// getters and setters...
}

在上面的例子中,@ConfigurationProperties 注解指定了 prefix 属性为 “myapp”,表示配置文件中的属性应该以 “myapp” 为前缀。例如,配置文件中的属性可以是 myapp.appName 和 myapp.maxConnections。这些属性将被映射到 MyAppProperties 类的相应字段上。

与@Value的区别

@ConfigurationProperties 和 @Value 是 Spring 中用于获取配置信息的两种不同方式

  1. 类型安全:

@ConfigurationProperties 提供了类型安全的配置绑定。你可以创建一个 Java 类,将配置属性映射到该类的字段上,Spring 会自动将配置文件中的值绑定到相应的字段,而且会进行类型转换。如果类型不匹配,Spring 会在启动时报错。
@Value 是基于 SpEL(Spring Expression Language)的,它是一个字符串表达式,不提供类型安全性。你需要手动进行类型转换,并且如果类型不匹配,可能会导致运行时错误。

  1. 多属性绑定:

@ConfigurationProperties 支持将多个属性绑定到一个类中,使得配置更加结构化,适用于组织复杂的配置信息。
@Value 一般用于单一属性的注入,较难组织复杂的配置信息。

  1. 适用场景:

@ConfigurationProperties 适用于大量配置属性、多个相关配置属性的情况,尤其是复杂的配置信息。
@Value 适用于简单的属性注入,对于少量的配置项。

最大的区别在于第一点类型安全上
使用 @ConfigurationProperties 时,可以将配置文件中的属性直接映射到一个 Java 类的字段上。Spring 在启动时会尝试将配置文件中的值转换为字段声明的类型。如果类型不匹配,Spring 会在启动时检测到并报告错误。这种类型检查是在应用程序启动时进行的,有助于提前发现配置错误,而不是在运行时发生意外行为。

其次就是可以通过java类管理配置属性,对于配置属性较多情况下可以使其更加统一

@value的优点体现在对于两个关系不大的配置上,比如有myapp.aaa.ccc.bbb=1myapp.qqq=2这样的两个配置
如果使用@ConfigurationProperties注解,需要嵌套方式去获取内容,如下:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {private final AAA aaa = new AAA();private int qqq;public static class AAA {private final CCC ccc = new CCC();public static class CCC {private int bbb;public int getBbb() {return bbb;}public void setBbb(int bbb) {this.bbb = bbb;}}public CCC getCcc() {return ccc;}}public AAA getAaa() {return aaa;}public int getQqq() {return qqq;}public void setQqq(int qqq) {this.qqq = qqq;}
}

结论

结合@ConfigurationProperties的优点,我们在约定配置文件时,相同的业务配置尽量有统一的前缀和减少嵌套(通过下划线或者横杠映射类的驼峰命名),不同的业务配置有不同的prefix。这样便于使用一个配置类管理。示例如下:
在这里插入图片描述

补充

补充一些其他类似的spring注解

  • @ConditionalOnproperity
    @ConditionalOnProperty 是 Spring Boot 中的一个条件注解,用于根据配置属性的值来决定是否要启用某个配置类、Bean 或组件。这个注解在以下场景中特别有用:

特定配置开关: 你可以使用 @ConditionalOnProperty 来根据配置文件中的某个属性值来决定是否启用某个配置。例如,只有在配置文件中设置了特定的属性时,某个Bean 或配置类才会生效。

@Configuration
@ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
public class MyFeatureConfiguration {// 配置类的内容...
}

myapp.feature.enabled=true,这样配置类 MyFeatureConfiguration 就会在属性 myapp.feature.enabled 的值为 true 时生效。

  • @ConditionalOnMissingBean
    @ConditionalOnMissingBean 是 Spring Boot 中的一个条件注解,用于在特定的 Bean 还不存在时启用某个配置类、Bean 或组件。这个注解在以下场景中特别有用:

默认实现: 当你有一个接口或抽象类有多个实现时,可以使用 @ConditionalOnMissingBean 注解来提供一个默认的实现。如果容器中已经有了某个实现的 Bean,那么就不会再创建这个默认实现的 Bean。

@Service
public class DefaultMyService implements MyService {// 默认实现的内容...
}@Service
@ConditionalOnMissingBean(MyService.class)
public class CustomMyService implements MyService {// 自定义实现的内容...
}

在这个例子中,如果容器中已经有了类型为 MyService 的 Bean(例如 DefaultMyService),那么 CustomMyService 就不会被创建。如果没有,就会创建 CustomMyService。

插件化扩展: 当你提供一种插件机制,允许开发者在应用程序中注册自定义实现时,可以使用 @ConditionalOnMissingBean。这样,如果用户自己定义了实现,就使用用户的实现;否则,使用默认实现。

@Configuration
public class MyConfig {@Bean@ConditionalOnMissingBeanpublic MyPlugin myPlugin() {return new DefaultMyPlugin();}
}

在这个例子中,如果容器中已经有了 MyPlugin 类型的 Bean,那么 myPlugin 方法就不会创建新的 Bean;否则,它会创建一个默认的 DefaultMyPlugin Bean。

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

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

相关文章

【ceph】传统分区和vg lvm 创建osd

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

pip基本命令和使用

关于 pip 的基本命令和使用方法: 安装包:使用 pip install package-name 命令来安装一个 Python 包。eg:要安装 numpy,可以运行 pip install numpy。 升级包:使用 pip install --upgrade package-name 命令来升级一个已安装的 Python 包。eg…

YAML入门

1 YAML概述 YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。YAML 的语法和其…

vmware ubuntu22 访问github

1.虚拟机选NAT模式。 2.firefox找到下图setting。 3.选第四个,填主机ip和局域网代理的端口号。 4. 此时你应该能访问github了。

SpringBoot之整合JWT

整合JWT 令牌组成 1.标头(Header)2.有效载荷(Payload)3.签名(Signature) 因此,JWT通常如下所示:xxxxx.yyyyy.zzzzz Header.Payload.Signature jwt组成 Header 标头通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法&…

vue+ts实现离线高德地图 内网离线高德地图

1、下载瓦片 我是用最简单的软件下载——MapDownloader 链接:https://pan.baidu.com/s/1Hz__HcA5QhtGmjLNezC_pQ 提取码:6lek 来源:https://blog.csdn.net/fuhanghang/article/details/131330034 2、部署私有化瓦片资源 这里也是用最简单的…

顺序表和链表面试题

文章目录 顺序表(1)原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。(2)删除有序数组中的重复项(3)合并两个有序数组 链表(1)删除链表中等于给定值 val 的所有节点(2)反转一个单链表(3) 合并两个有序链表(4)链表的中间结点(5)链表中…

顶级资源!五个免费图标素材网站

图片太花哨了,纯文本太单调了?别忘了设计师的魔法武器——图标!图标材料是UI设计师不可缺少的一部分。优秀的图标设计不仅可以提高界面美感,还可以提高用户的互动体验,帮助用户更好地了解应用程序的功能和信息。在本文…

动态类型语言与静态类型语言的对比与比较

编程语言可以根据类型系统和类型检查时机分为动态编程语言和静态编程语言两大类,它们在运行时的代码检查方式、变量类型的使用方式等方面有很大的区别。这一块你知道吗? 本文将为您详细讲解两种编程语言的优缺点,以及它们的应用场景。 动态编…

Innodb-ruby深入探索Innodb存储结构

达在之前已经分享过Innodb数据存储结构知识,但是都是基于理论原理知识理解,今天利用Innodb文件解析工具ruby进行探索Innodb真实的存储结构。 索引原理过程:【Mysql】 InnoDB引擎深入 - 数据页 | 聚集索引_innodb的聚集索引的数据插入_Surviv…

2952. 需要添加的硬币的最小数量(结论题)

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 分析知:设指针值从1开始依次递增,每次将coins里的值累加起来看能否得到或者大于当前指针值 ,否则就将该指针值累加起来,即需要添加的数 class Solution …

老师需要具备的能力

作为一名老师,需要具备许多能力,来有效地教授学生知识和技能。本文将从以下几个方面探讨老师所需具备的能力。 一、教学能力 教学是老师工作的核心,因此老师需要具备高超的教学能力。这包括了开展教学计划、教学设计、授课技巧和引导学生思考…

2023年甘肃职业院校技能大赛(中职教师组)网络安全竞赛样题(五)

2023年甘肃职业院校技能大赛(中职教师组) 网络安全竞赛样题(五) (总分1000分) 目录 模块A 基础设施设置与安全加固 模块B 网络安全事件响应、数字取证调查和应用安全 B-1任务一:Linux系统安…

bootstrap中的图标元素可以免费使用

Available glyphsIncludes over 250 glyphs in font format from the Glyphicon Halflings set. Glyphicon 网址如下: Components Bootstrap

连接池 Druid (四) - 连接归还

轻车熟路,连接归还是通过Connection的代理对象重写close方法完成的,通过前面的学习我们已经知道Connectin的代理对象是DruidPooledConnection,所以我们直接看DruidPooledConnection的close方法。 DruidPooledConnection#close 直接上代码: …

2024年天津财经大学珠江学院专升本专业课考试《经济学》考试大纲

天津财经大学珠江学院2024年高职升本科专业课考试《经济学》考试大纲 一、本大纲系天津财经大学珠江学院2024年高职升本科《经济学》课程考试大纲。所列考试范围出自郑健壮、王培才主编的教材《经济学基础(第二版)》,清华大学出版社&#xf…

【Python】pptx文件转pdf

要将PPTX文件转换为PDF格式,你可以使用Python的python-pptx库来读取PPTX文件,然后使用comtypes库在Windows上或unoconv在Linux上来进行转换。但是,需要注意的是,comtypes依赖于Microsoft Office,而unoconv依赖于LibreO…

线程控制.

线程已经成为调度的基本单位了,每一个线程都属于同一个地址空间中,所有的线程都属于同一个进程 换句话任何一个线程尝试调用geipid它应该是同一个pid 可是OS选择线程时,他怎么知道哪个线程是主线程?哪个是新线程?线程也…

C语言-字符串变量

字符串变量 char* s “Hello, world!”; s是一个指针,初始化为指向一个字符串常量 由于这个常量所在的地方,所以实际上s是const char* s,但是由于历史的原因,编译器接受不带const的写法但是试图对s所指的字符串做写…

CAD画图-模型和布局区别,视图命令MV使用(用于局部放大显示)

模型和布局的图像区别 模型的图像: 是我们常编辑的cad文件,我们可以对里面内容进行编辑和测量等操作 布局的图像:为了可以更好的看到每个部件的相对位置,但对于里面的点位的标注就不行了,但可以对图像中的某些部位进行…