SpringBoot开发使用@ConfigurationProperties代替@Value笔记

一、背景

最近在项目开发中,遇到大量配置信息在不同微服务中使用,发现维护配置信息变得越来越复杂,修改一个配置命名,就要连着改好多@Value,因为配置管理而头疼。

二、@Value注解

可以轻松地将配置文件中的值注入到Spring Bean中。例如:

@Value("${app.name}")
private String appName;

通过@Value注解将配置文件中的app.name属性注入到appName变量中即可使用,看起来很方便,然而,@Value并不完美。

三、@Value的局限性

随着项目的扩展,会发现配置项散落在各个类中,导致配置信息碎片化,难以集中管理。
比如,可能会有成百上千个这样的注解分布在不同的类中,这样的维护工作难度很大。例如:

@Value("${db.username}")
private String dbUsername;@Value("${db.password}")
private String dbPassword;@Value("${db.url}")
private String dbUrl;

如果需要修改数据库配置,那得在多个地方进行修改,这无疑增加出错的风险。

四、推荐方案:@ConfigurationProperties

为应对这些问题,Spring Boot提供了@ConfigurationProperties注解,可以将配置集中管理,并且更加清晰和可维护。
首先,定义一个配置类:

@ConfigurationProperties(prefix = "db")
public class DatabaseProperties {private String username;private String password;private String url;// getters and setters
}

接着,需要在Spring Boot应用中启用这个配置类:即在启动类加入注解

@SpringBootApplication
@EnableConfigurationProperties(DatabaseProperties.class)
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}

这样,就可以通过注入DatabaseProperties类来使用这些配置:

@Service
public class DatabaseService {private final DatabaseProperties databaseProperties;public DatabaseService(DatabaseProperties databaseProperties) {this.databaseProperties = databaseProperties;}public void printDatabaseConfig() {System.out.println("URL: " + databaseProperties.getUrl());System.out.println("Username: " + databaseProperties.getUsername());}
}

通过@ConfigurationProperties,可以将相关的配置集中在一个类中,这样不仅可以简化配置管理,还可以提高代码的可维护性。
所有与数据库相关的配置都集中在DatabaseProperties类中,修改起来也更方便。

五、配置校验

在实际开发中,配置的校验很重要,Spring Boot提供了spring-boot-starter-validation模块,可以通过@Validated注解实现配置校验。例如:

@ConfigurationProperties(prefix = "db")
@Validated
public class DatabaseProperties {@NotNullprivate String username;@NotNullprivate String password;@NotNull@URLprivate String url;// getters and setters
}

通过这种方式,可以在应用启动时就校验配置是否正确,避免了运行时才发现配置错误的问题。

六、完整案例

用实际项目中的完整案例,来更好地理解@Value迁移到@ConfigurationProperties的过程。

假设:一个完整项目包含多个微服务,每个服务都有自己独立的配置文件。最初使用@Value注解来读取配置,但是随着项目的扩展,配置项越来越多,导致维护起来非常困难。
因此,决定将@Value注解迁移到@ConfigurationProperties。

1.迁移前的代码

配置文件 application.properties:

db.username=root
db.password=secret
db.url=jdbc:mysql://localhost:3306/mydb

服务类 DatabaseService:

@Service
public class DatabaseService {@Value("${db.username}")private String username;@Value("${db.password}")private String password;@Value("${db.url}")private String url;public void printDatabaseConfig() {System.out.println("URL: " + url);System.out.println("Username: " + username);}
}
2.迁移步骤

创建配置类
首先,创建一个用于存储数据库配置的类,并使用@ConfigurationProperties注解。

@ConfigurationProperties(prefix = "db")
public class DatabaseProperties {private String username;private String password;private String url;// getters and setters
}

启用配置类

然后,需要在Spring Boot应用中启用这个配置类。在主类中添加@EnableConfigurationProperties注解。

@SpringBootApplication
@EnableConfigurationProperties(DatabaseProperties.class)
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}

修改服务类

接下来,修改DatabaseService类,使用DatabaseProperties类来注入配置。

@Service
public class DatabaseService {private final DatabaseProperties databaseProperties;public DatabaseService(DatabaseProperties databaseProperties) {this.databaseProperties = databaseProperties;}public void printDatabaseConfig() {System.out.println("URL: " + databaseProperties.getUrl());System.out.println("Username: " + databaseProperties.getUsername());}
}

添加配置校验
为确保配置的正确性,可以在DatabaseProperties类上添加校验注解。

@ConfigurationProperties(prefix = "db")
@Validated
public class DatabaseProperties {@NotNullprivate String username;@NotNullprivate String password;@NotNull@URLprivate String url;// getters and setters
}
七、挑战点

在迁移过程中,可能会遇到一些挑战,比如:

重构现有代码:需要花费一定时间将所有@Value注解替换为@ConfigurationProperties。配置校验:添加校验逻辑后,必须确保所有配置项都满足要求,否则应用无法启动。团队协作:迁移过程中,需要团队成员共同参与,确保所有服务都同步迁移。

总的来说,@ConfigurationProperties相对于@Value具有明显的优势,它可以简化配置管理,集中配置信息,并且通过配置校验提高应用的可靠性。

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

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

相关文章

GSettings(五)——没有图形界面的环境,调用gsettings

“没有图形界面的环境”是指没有运行桌面环境或窗口管理器的情况下运行程序。也就是说,可能是在一个纯命令行界面或服务器环境中工作,没有访问显示服务器(如X11或Wayland)的情况。 情景解释 没有图形界面的环境 这种情况下&#…

Odoo专题资料

odoo开发规范 | 同欣数字化落地 (txodoo.cn) odoo性能优化思路 | 同欣数字化落地 (txodoo.cn) 生产环境安装odoo | 同欣数字化落地 (txodoo.cn) odoo开发环境搭建windows版详细教程 | 同欣数字化落地 (txodoo.cn) mac安装odoo17 | 同欣数字化落地 (txodoo.cn) 控制表单默认…

贪心算法练习题(2024/6/21)

1 买卖股票的最佳时机 II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得…

论文学习_Fuzz4All: Universal Fuzzing with Large Language Models

论文名称发表时间发表期刊期刊等级研究单位Fuzz4All: Universal Fuzzing with Large Language Models2024年arXiv-伊利诺伊大学0.摘要 研究背景模糊测试再发现各种软件系统中的错误和漏洞方面取得了巨大的成功。以编程或形式语言作为输入的被测系统(SUT),例如编译器、运行时…

树莓派4B_OpenCv学习笔记12:OpenCv颜色追踪_画出轨迹

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 今日尝试使用倒叙的方式来学习OpenCV颜色追踪&#xff0…

Claude 3.5 强势出击:解析最新AI模型的突破与应用

近年来,人工智能领域的发展迅猛,各大科技公司纷纷推出了自家的高级语言模型。在这场技术竞赛中,Anthropic的Claude系列模型凭借其强大的性能和创新的功能脱颖而出。最近,Anthropic发布了Claude 3.5 Sonnet模型,引起了广…

如何设置Excel单元格下拉列表

如何设置Excel单元格下拉列表 在Excel中设置单元格下拉列表可以提高数据输入的准确性和效率。以下是创建下拉列表的步骤: 使用数据验证设置下拉列表: 1. 选择单元格: 选择你想要设置下拉列表的单元格或单元格区域。 2. 打开数据验证&…

[Django学习]Q对象实现多字段模糊搜索

一、应用场景 假设我们现在有一个客房系统,前端界面上展示出来了所有客房的所有信息。用户通过客房的价格、面积、人数等对客房进行模糊搜索,如检索出价格在50到100元之间的客房,同时检索面积在20平方米到30平方米之间的客房,此时后端可以借助…

【C++】在boost中查找有向图的所有循环

在boost中查找有向图的所有循环 #include <boost/graph/adjacency_list.hpp> #include <boost/graph/tiernan_all_cycles.hpp> #include <iostream>using Graph = boost::adjacency_list<boost::vecS, boost::vecS, boost::/*un*/directedS>;// see h…

高斯算法的原理及其与常规求和方法的区别

高斯算法的原理 高斯算法的原理源于数学家卡尔弗里德里希高斯在他少年时期发现的一种求和方法。当时老师让学生们计算1到100的和&#xff0c;高斯发现了一种快速计算的方法。 高斯注意到&#xff0c;如果将序列的首尾两数相加&#xff0c;结果总是相同的。例如&#xff1a; …

layui导入excel

前端&#xff1a; 按钮&#xff1a;<a class"layui-btn layui-btn-sm layuiadmin-button-btn train-btn-css"id"uploadGuideExcel">Excel导入计划</a> // //导入计划upload.render({elem: #uploadGuideExcel, //修改为你的urlurl: domainName…

DVWA 靶场 JavaScript 通关解析

前言 DVWA代表Damn Vulnerable Web Application&#xff0c;是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序&#xff0c;旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…

【Python】从基础到进阶(一):了解Python语言基础以及变量的相关知识

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、Python简介1.1 历史背景1.2 设计哲学1.3 语言特性1.4 应用场景1.5 为什么选择Python 二、Python语言基础2.1 注释规则2.1.1 单行注释2.1.2 多行注释2.1.3 文件编码声明注释 2.2 代码缩进2.3 编码规范2.3.1 命名规范…

vim选中内容进入visual模式

描述 有的版本的vim&#xff0c;检测到xterm终端时&#xff0c;会启动鼠标全功能模式&#xff0c;鼠标选中一段文本后&#xff0c;自动进入visual模式&#xff0c;滚动滚轮可以修改选中的位置。可以使用常见的Vim命令来操作它们&#xff0c;例如&#xff1a; y 复制&#xff…

AlphaMissense:预测错义变异的致病性

错义变异或错义变体&#xff08;missense variation或missense variants&#xff09;是改变蛋白质氨基酸序列的遗传变异。致病性错义变异会严重破坏蛋白质功能&#xff0c;在目前观察到的400多万个错义变异中&#xff0c;只有2%在临床上被确定为致病或良性。对剩下的类型不明的…

力扣随机一题 模拟+字符串

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 1910.删除一个字符串中所有出现的给定子字符串【中等】 题目&#xff1a; …

【数据结构与算法】树的遍历,森林遍历 详解

树的先根遍历、后根遍历对应其二叉树的哪种遍历 树的先根遍历对应其二叉树的先序遍历&#xff08;根-左-右&#xff09;。树的后根遍历对应其二叉树的中序遍历&#xff08;左-根-右&#xff09;。 森林的先根遍历、中根遍历对应其二叉树的哪种遍历? 森林的先根遍历对应其二…

Elasticsearch 数据提取 - 最适合这项工作的工具是什么?

作者&#xff1a;来自 Elastic Josh Asres 了解在 Elasticsearch 中为你的搜索用例提取数据的所有不同方式。 对于搜索用例&#xff0c;高效采集和处理来自各种来源的数据的能力至关重要。无论你处理的是 SQL 数据库、CRM 还是任何自定义数据源&#xff0c;选择正确的数据采集…

STM32三种调试工具CMSIS-DAP、J-Link和ST-Link

一.概述 CMSIS-DAP、J-Link和ST-Link均是嵌入式处理器的开发调试工具。 CMSIS-DAP是一种轻量级调试接口&#xff0c;旨在实现开源的开发调试。它的优点是使用方便、通用性好、成本低&#xff0c;还支持固件的在线升级。 J-Link是一款由德国公司SEGGER Microcontroller开发的…

《Deep learning practice》learning notes

学习笔记&#xff1a; 【公开课】旷视x北大《深度学习实践》&#xff08;28课时全&#xff09; R Talk | 旷视科技目标检测概述&#xff1a;Beyond RetinaNet and Mask R-CNN 文章目录 Lecture 1: Introduction to Computer Vision and Deep Learning&#xff08;孙剑&#x…