【@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,一经查实,立即删除!

相关文章

vmware ubuntu22 访问github

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

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 …

老师需要具备的能力

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

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

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

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

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

线程控制.

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

C语言-字符串变量

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

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

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

软件项目功能测试框架

测试用例的编写需要按照一定的思路进行,而不是想到哪写到哪,一般测试机制成熟的公司都会有公司自己自定义的测试用例模板,以及一整套的测试流程关注点,当然我们自己在测试生涯中也应当积累一套自己的测试框架,所有功能…

二极管:TVS瞬态抑制二极管

一、什么是TVS二极管 TVS(Transient Voltage Suppressors),即瞬态电压抑制器,又称雪崩击穿二极管。 TVS二极管的符号如下图所示 什么是雪崩击穿 雪崩击穿是有必要了解一下的,不然后面还有齐纳击穿,搞不…

第二十一章 网络通信

21.1 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。 局域网与互联网 服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机,实现两者间的相互通信。 网络协议 网络协议规定了计算…

P4715 【深基16.例1】淘汰赛-仅思路

首先从题干要求入手,我们可以了解到题目要求是二进一,不难想到这是二叉树的题 再来,从题干可以知道,我们所采用的结构体除了需要有树的两个左右节点指针外,还需要两个变量用来储存“能力值”和“编号” 在这道题中&am…

竞赛选题 题目:基于深度学习的图像风格迁移 - [ 卷积神经网络 机器视觉 ]

文章目录 0 简介1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 简介 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习卷积神经网络的花卉识别 该项目较为新颖,适合作为竞赛课题方向&#xff0c…

CoreDNS实战(三)-CoreDNS+ETCD实现DNS负载均衡

1 概述 DNS负载均衡简单来说就是通过一个域名绑定多个IP地址,当客户端访问域名时,DNS服务器将轮询返回其中一个IP,实现客户端分流的作用。 在K8s环境中CoreDNS作为容器服务的DNS服务器,那么就可以通过CoreDNS来实现DNS负载均衡&a…

【Linux】基础IO--重定向理解Linux下一切皆文件缓冲区

文章目录 一、重定向1.什么是重定向2.dup2 系统调用3.理解输入重定向、输出重定向和追加重定向4.简易shell完整实现 二、理解linux下一切皆文件三、缓冲区1.为什么要有缓冲区2.缓冲区的刷新策略3.缓冲区的位置4.实现一个简易的C语言缓冲区5.内核缓冲区 一、重定向 1.什么是重定…