解锁Spring Boot的强大配置功能:@ConfigurationProperties与@PropertySources详解
解锁Spring Boot的强大配置功能:@ConfigurationProperties与@PropertySources详解
- 前言
- 什么是@ConfigurationProperties和@PropertySources
- @ConfigurationProperties的使用
- 步骤 1: 创建 Java POJO 类
- 步骤 2: 配置类
- 步骤 3: 配置文件
- 步骤 4: 注入配置属性
- @PropertySources的使用
- @PropertySources与@ConfigurationProperties的区别
- `@PropertySources` 注解的作用:
- 与 `@ConfigurationProperties` 的关系:
前言
在当今的软件开发世界中,配置管理是至关重要的一部分。Spring框架为我们提供了多种配置方式,其中@ConfigurationProperties和@PropertySources是强大的工具,可以帮助我们轻松管理应用程序的配置信息。本博客将深入探讨这两个关键注解,介绍它们的用途以及如何在Spring应用程序中使用它们。无论你是新手还是经验丰富的开发者,这篇博客都将为你提供有关配置文件管理的深入知识,帮助你编写更具可维护性和可扩展性的代码。
什么是@ConfigurationProperties和@PropertySources
@ConfigurationProperties
和 @PropertySources
都是与属性配置相关的注解,用于在 Spring 应用程序中管理和加载配置信息。
-
@ConfigurationProperties
:@ConfigurationProperties
是 Spring Boot 中的一个注解,用于将配置文件中的属性值绑定到 Java Bean 上。通常,这个注解用于将外部属性文件中的属性值映射到应用程序的配置类中,以便在整个应用程序中方便地访问和使用这些属性。- 这个注解通常与
@Configuration
或@Component
一起使用,以将配置属性绑定到一个特定的 Java Bean。通过在类上使用@ConfigurationProperties
,您可以将属性文件中的键与 Java Bean 的字段或属性进行映射。
示例:
@Configuration @ConfigurationProperties(prefix = "myapp") public class MyAppProperties {private String name;private String version;// getters and setters }
在上述示例中,
@ConfigurationProperties
注解将以myapp
前缀开头的属性映射到MyAppProperties
类的字段中。 -
@PropertySources
:@PropertySources
是 Spring Framework 中的注解,用于指定多个属性源,以便在 Spring 应用程序中解析属性。每个属性源可以是一个属性文件,用于存储配置信息。与@PropertySource
类似,@PropertySources
允许您在多个地方定义属性源,以便将配置信息分散在不同的文件中。- 这个注解通常与
@Configuration
一起使用,以将多个属性源引入 Spring 应用程序的环境中。
示例:
@Configuration @PropertySources({@PropertySource("classpath:application.properties"),@PropertySource("classpath:custom.properties") }) public class AppConfig {// 这里可以注入和使用从属性文件加载的配置属性 }
在上述示例中,
@PropertySources
注解指定了两个属性源,分别是application.properties
和custom.properties
。
总结:
@ConfigurationProperties
主要用于将外部属性映射到 Java Bean,适用于 Spring Boot 应用程序。@PropertySources
主要用于指定多个属性源,以在 Spring 应用程序中加载配置属性,适用于标准的 Spring 应用程序。
@ConfigurationProperties的使用
在 Spring Boot 应用程序中,您可以使用 @ConfigurationProperties
注解来绑定配置属性,并将其注入到 Spring Bean 中。以下是如何执行这些步骤的详细说明:
步骤 1: 创建 Java POJO 类
首先,创建一个普通的 Java 类(POJO),该类的属性将映射到您的配置属性。这个类通常被用于存储和操作配置属性的值。确保为属性提供适当的 getter 和 setter 方法。
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {private String name;private String version;// 省略构造函数、getter 和 setter 方法
}
在上面的示例中,@ConfigurationProperties
注解指定了一个前缀 "myapp"
,这意味着配置文件中的属性键应以 "myapp"
开头。例如,myapp.name
和 myapp.version
。
步骤 2: 配置类
接下来,创建一个配置类,用于加载配置属性并将它们绑定到您的 Java POJO 类。通常,这个配置类应该使用 @Configuration
注解进行标记。
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableConfigurationProperties(MyAppProperties.class)
public class AppConfig {
}
@EnableConfigurationProperties
注解用于启用对 MyAppProperties
类的配置属性绑定。
步骤 3: 配置文件
在 application.properties
或 application.yml
文件中,添加与您的配置属性相关的属性键和值。确保它们以与 @ConfigurationProperties
注解中指定的前缀匹配的方式进行命名。
myapp.name=My Spring Boot App
myapp.version=1.0
或者,使用 YAML 格式:
myapp:name: My Spring Boot Appversion: 1.0
步骤 4: 注入配置属性
最后,在您的 Spring Bean 中注入 MyAppProperties
类,以访问配置属性的值。您可以通过构造函数注入或使用 @Autowired
注解进行注入。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {private final MyAppProperties myAppProperties;@Autowiredpublic MyService(MyAppProperties myAppProperties) {this.myAppProperties = myAppProperties;}public void doSomething() {String appName = myAppProperties.getName();String appVersion = myAppProperties.getVersion();// 使用配置属性进行操作System.out.println("App Name: " + appName);System.out.println("App Version: " + appVersion);}
}
现在,您的 MyService
Bean 可以访问通过 @ConfigurationProperties
注解绑定的配置属性。
通过上述步骤,您可以成功地在 Spring Boot 应用程序中使用 @ConfigurationProperties
注解将配置属性绑定到 Java POJO 类,并将其注入到 Spring Bean 中,以便在应用程序中使用这些属性的值。这种方式使配置属性的管理和使用变得非常方便。
@PropertySources的使用
在 Spring Boot 中,通常使用 @PropertySource
注解和 application.properties
(或 application.yml
)文件来管理应用程序的配置属性。虽然 @PropertySources
注解在标准 Spring 应用程序中更常见,但在 Spring Boot 中,通常使用 @PropertySource
和默认的 application.properties
或 application.yml
更为常见。不过,我可以提供一个示例,演示如何在 Spring Boot 中使用 @PropertySources
注解来指定多个属性源。
以下是一个示例:
-
创建一个 Spring Boot 项目。
-
创建一个配置类,例如
AppConfig.java
,并使用@PropertySources
注解来指定多个属性源。
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;@Configuration
@PropertySources({@PropertySource("classpath:default.properties"), // 默认属性源@PropertySource("classpath:custom.properties") // 自定义属性源
})
public class AppConfig {
}
在上述示例中,我们在 AppConfig
类上使用 @PropertySources
注解,并指定了两个属性源,分别是 default.properties
和 custom.properties
。这两个属性源位于类路径下,可以包含不同的配置属性。
- 创建属性文件
default.properties
和custom.properties
并放置在src/main/resources
目录下。示例default.properties
文件内容如下:
app.name=My Spring Boot App (Default)
app.version=1.0 (Default)
示例 custom.properties
文件内容如下:
app.name=My Custom Spring Boot App
- 创建一个服务类,例如
MyService.java
,并使用@Value
注解来注入属性。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class MyService {@Value("${app.name}")private String appName;@Value("${app.version}")private String appVersion;public String getAppInfo() {return "App Name: " + appName + ", App Version: " + appVersion;}
}
在上述示例中,我们使用 @Value
注解来注入属性 app.name
和 app.version
,这些属性的值将从属性源中获取。
- 创建一个控制器类,例如
MyController.java
,并在其中使用MyService
来获取属性值并返回给客户端。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {private final MyService myService;@Autowiredpublic MyController(MyService myService) {this.myService = myService;}@GetMapping("/app-info")public String getAppInfo() {return myService.getAppInfo();}
}
- 启动应用程序,并访问
/app-info
路径,您将看到根据不同属性源获取的应用程序信息。
在这个示例中,我们使用了 @PropertySources
注解来指定多个属性源,并在服务类中使用 @Value
注解来注入属性。这使得应用程序能够根据属性源的不同而获取不同的属性值。不过需要注意,在 Spring Boot 中,通常更常见的做法是使用默认的 application.properties
(或 application.yml
)文件以及 @ConfigurationProperties
注解来管理配置属性。
@PropertySources与@ConfigurationProperties的区别
@PropertySources
注解是 Spring 框架中用于指定多个属性源的注解。它的主要作用是允许您在 Spring 应用程序中定义多个属性源,以便在不同位置或不同配置文件中存储和管理配置属性。这有助于将配置信息分散在多个文件中,使应用程序更加模块化和可维护。下面详细介绍 @PropertySources
注解的作用以及与 @ConfigurationProperties
的关系:
@PropertySources
注解的作用:
-
指定多个属性源:
@PropertySources
允许您在一个配置类中指定多个属性源,每个属性源对应一个属性文件。这些属性源可以包含应用程序的配置信息,如数据库连接参数、日志级别、服务端口等。 -
模块化配置: 通过将配置信息分散在多个属性文件中,您可以将应用程序的配置模块化,使每个模块负责自己的配置。这使得代码更易于维护和理解,特别是在大型应用程序中。
-
环境适应性: 您可以为不同的环境(如开发、测试、生产)或不同的配置需求定义不同的属性源。这使得应用程序能够在不同环境中使用不同的配置,而不必修改代码。
-
属性源优先级: 如果存在多个属性源,Spring 将按照它们在
@PropertySources
注解中的顺序来解析属性。这意味着后面的属性源可以覆盖前面的属性源中的属性值。
与 @ConfigurationProperties
的关系:
-
@PropertySources
和@ConfigurationProperties
都用于处理配置属性,但它们的关注点和使用方式不同。 -
@PropertySources
主要用于定义属性源,将配置信息存储在不同的属性文件中,并在不同环境或模块之间共享配置。它不直接与 Java Bean 绑定。 -
@ConfigurationProperties
主要用于将配置属性绑定到 Java Bean 上。它通常与@Configuration
或@Component
注解一起使用,以将外部属性文件中的属性值映射到一个特定的 Java Bean。 -
通常情况下,您会使用
@PropertySources
来定义属性源,然后使用@ConfigurationProperties
来将属性源中的属性值绑定到 Java Bean,以便在整个应用程序中使用这些属性。这两个注解可以协同工作,但它们的功能不同,各自有其用途。
综上所述,@PropertySources
注解用于管理多个属性源,而 @ConfigurationProperties
注解用于将配置属性绑定到 Java Bean。它们可以一起使用,以实现更灵活和模块化的配置管理。
相关文章:
解锁Spring Boot的强大配置功能:@ConfigurationProperties与@PropertySources详解
解锁Spring Boot的强大配置功能:ConfigurationProperties与PropertySources详解 前言什么是ConfigurationProperties和PropertySourcesConfigurationProperties的使用步骤 1: 创建 Java POJO 类步骤 2: 配置类步骤 3: 配置文件步骤 4: 注入配置属性 PropertySources…...
Java和Vue字符串加密
字符串加密 AES 加密算法 在 Java 中,可以使用不同的加密算法来对字符串进行加密。以下是使用 AES 加密算法的示例代码,演示如何对一个字符串进行加密: import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java…...
Java:java版结巴分词:jieba-analysis
文档 https://github.com/huaban/jieba-analysishttps://mvnrepository.com/artifact/com.huaban/jieba-analysis 依赖 <!-- https://mvnrepository.com/artifact/com.huaban/jieba-analysis --> <dependency><groupId>com.huaban</groupId><art…...
java生成一个符合密码学和安全性的随机秘钥
有时 我们在生成token 或者完成某种加密形式时会需要一个秘钥 但是 有些时候 项目开发并没有规定用什么秘钥 但是 秘钥都是要有一定格式规范的 我们可以通过以下代码生成一个随机秘钥 import java.security.SecureRandom; import java.util.Base64;public class TokenGenerat…...
C++ - 右值引用 和 移动拷贝
右值引用 我们先来了解什么是左值,什么是右值: 左值 和 有值 区分 首先,左值 和 右值 并不是完全意味着 在 "" 左边的就是 左值 ; 在 "" 右边的就是右值。这是不一定的。只能说,在左边的大概率是…...
项目成员积分规则
在当下的项目/团队管理种,如何让成员能清晰的看到,自己的工作、努力在团队种属于那个段位,通过这个形式,并配合其他方式去点燃成员的进步之心。以积分的形式,代替绩效考核,一些零散的想法,欢迎各…...
Linux CentOS7 vim多窗口编辑
我们在用vim编辑文件时,有各种需求。如有时需要在多个文件之间来回操作,一会关闭一个文件,一会再打开另外一个文件,这样来回操作显得太笨拙。有时,vim编辑多行的大文件,来回查看、编辑前面一部分及最后一部…...
git使用,一点点
查看自己有没有安装git git --version 如果没有安装请执行sudo yum install -y git来安装 git 指令 git log 查看日志 git pull 同步远端和本地仓库 这就是冲突的报错: 所以这个时候你要同步一下git pull...
第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第八节 - 如何在 C/C++、Python 和 Java 中分割字符串?)
通过某些分隔符分割字符串是一项非常常见的任务。例如,我们有一个文件中以逗号分隔的项目列表,并且我们希望数组中包含各个项目。 几乎所有编程语言都提供按某些分隔符分割字符串的函数。 目录 在C中: 在 C++ 中 方法一:使用C++的stringstream API...
【Java】语法特性篇
语法特性篇 Java对象的比较 1. 对象比较的问题 Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较。那为什么可以比较? 因为:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法…...
Vim教程
目录 vim 介绍 常用的四种模式 首先先学会如何正确进入和退出vim: normal模式 insert模式: command模式: v-block模式: vim异常退出 vim配置 vim 介绍 Vim是一款高度可定制的文本编辑器,它的前身是Vi…...
selenium查找网页如何处理网站资源一直加载非常卡或者失败的情况
selenium查找网页如何处理网站资源一直加载失败的情况 selenium获取一个网页,某个网页的资源卡了很久还没有加载成功,如何放弃这个卡的数据,继续往下走 有2钟方式。通常可以采用下面的方式一来处理这种情况 方式一、WebDriverWait 这种方式…...
并发工具类库使用的常见问题
一、ThreadLocal在多线程环境中没有清理 由于ThreadLocal是和线程绑定的,如果线程被复用了,也即使用了线程池,那么ThreadLocal中的值是可能被复用的,这个特性如果是开发者没有预料到的,那么会产生很大的问题。例如&am…...
GD32F10X ----RTC
1. RTC的简介 STM32 的实时时钟(RTC)是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置…...
使用UiPath和AA构建的解决方案 1. 机器人过程自动化入门
你好!在这本系列,我们将指导您完成一些真实世界的机器人过程自动化(RPA)项目。感谢您的加入。当你完成本系列时,你将具备使用UiPath和Automation Anywhere在最低指导下进行简单到中等复杂度RPA项目的知识、技术和心态。 RPA是一项令人兴奋的新技术,被视为使用新的先进技…...
rust字面量
字面量就是值。值最终必须编码成二进制存储在某块内存上。 变量与字面量的关系就像杯子和水的关系。 字面量是有类型的。字面量类型有:布尔、数字、文本、字节 一、布尔 类型是bool true false 二、数字 通过后缀表示类型 通过前缀表示进制 通过 “_” 来分割数…...
Unix Network Programming Episode 79
‘gai_strerror’ Function The nonzero error return values from getaddrinfo have the names and meanings shown in Figure 11.7. The function gai_strerror takes one of these values as an argument and returns a pointer to the corresponding error string. #incl…...
Cesium展示——wkt 数据绘制
文章目录 需求分析1. 第一步,数据类型转换2. 第二步,数据渲染需求 WKT 是什么:WKT 简介 在这里,我选择将 Cesium 中将wkt数据转化为geoJSON格式后渲染至地球上 分析 1. 第一步,数据类型转换 npm install terraformer-wkt-parser --savelet wkts =...
打造完美家庭空间,让生活更加舒适
在现代繁忙的都市生活中,家是人们温暖而舒适的避风港。而如何打造一个恰到好处的家庭空间,成为了许多人心中的追求。今天,就让我们来探索一些空间布局方案,为您的家庭营造一个完美融合功能与美感的舒适空间。 🏠&…...
解决loadDep:omelette: sill install loadAllDepsIntoIdealTree
报错信息如下: 解决方案: 1、设置为淘宝的镜像源 npm config set registry https://registry.npm.taobao.org 2、 命令检验是否成功 npm config get registry 3、继续运行npm install即可 npm install 运行效果:...
【深蓝学院】手写VIO第2章--IMU传感器--作业
这次作业坑很多,作业说明的不清楚,摸索了很长时间才将此次作业完成,在这里进行记录。 1. T1 1.1 题干 1.2 解答 1.2.1 法1,ros related方法 不知道为什么我的launch不了,在imu_utils目录下面建立build后࿰…...
Android多线程学习:线程
一、概念 进程:系统资源分配的基本单位,进程之间相互独立,不能直接访问其他进程的地址空间。 线程:CPU调度的基本单位,线程之间共享所在进程的资源,包括共享内存,公有数据,全局变量…...
canvas 入门
canvas 入门 canvas是干什么的?canvas 绘制直线canvas画虚线canvas 绘制三角形canvas 绘制正方形canvas 绘制圆形、圆弧与椭圆canvas绘制文本canvas绘制图片 canvas是干什么的? <canvas> 是HTML5中的标签,它是一个容器,可以…...
建议收藏!混迹职场多年总结出的8大技巧!
1. 不要吃“哑巴”亏:不管在什么企业,一定要“会说话”,敢于表达自己,但是又兼顾身边人的感受,考虑好自己的言行将会带来的后果。良好的沟通技巧对于在职场中建立良好的人际关系和解决问题至关重要。学会倾听、表达和理…...
OpenCV4(C++)—— 视频和摄像头的加载、显示与保存
文章目录 一、加载与显示二、保存 一、加载与显示 视频或摄像头的加载是使用 cv::VideoCapture 类。(这个类和 ifstream 类比较相似,视频或摄像头的加载和文本文件操作是大致相同。主要步骤:(1)加载(打开&a…...
excel功能区(ribbonx)编程笔记6-box的使用
box元素用来在组里指定的控件周围放置一个可视的框,其主要目的是将控件作为一个单元组合在一起。 通常情况下,分配到组中的每个控件都被放置在先前的控件下面直到该列被填满,然后下一个控件被放置在其右侧列的顶行。然而,通过在框里面组合命令,可以将几个控件视作一个整体…...
oralce配置访问白名单的方法
目录 配置sqlnet.ora文件 重新加载使配置生效 注意事项 Oracle数据库安全性提升:IP白名单的配置方法 随着互联网的发展,数据库安全问题也越来越严重。Oracle是目前使用较为广泛的一款数据库管理系统,而IP白名单作为提升数据库安全性的有效…...
ToBeWritten之让响应团队参与并做好沟通
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...
ffmpeg ts 关于av_seek_frame
1 ffmpeg命令行 一般对视频文件的裁剪 我们通过一行 ffmpeg命令行即可实现,比如 ffmpeg -ss 0.5 - t 3 - i a.mp4 vcodec copy b.mp4 其中 -ss 放置较前 开启精准seek定位 对于mp4而言 seek将从moov中相关索引表查找 0.5s时刻附近最近的关键帧 (此描述…...
【C++】set map 的底层封装
在了解底层封装之前除了对set和map的使用情况要有一定了解,还需要先学习一下二叉搜索树,AVL树,红黑树这些数据结构。 【C】二叉搜索树 【C】AVL树 & 红黑树 RBTree.h enum Colour {RED,BLACK };template<class T> class RBTreeNo…...
免费做网站公司/投资网站建设方案
这是一道DP题,我写的时候也是尽量往DP了想,最后使用了一种蹩脚的类似DP又不太像是DP的方法写了出来 求最小的移动步数,先得求出一个已知骑士和国王的位置,求出其到其他位置的最小移动步数 国王的位置已知的话,最小步…...
常州制作企业网站/网站注册页面
一. 在JavaScript中,一切皆对象,每个对象都有一个原型对象(prototype),而指向该原型对象的内部指针则是__proto__。当我们对对象进行for in 或者for of遍历时,就会通过__proto__依次遍历对象关联的所有对象。这就是原型链&#x…...
公司需要一个简单的网站/下载百度地图2022最新版官方
Tools 工具 性能分析– 在脚本运行期定时执行不同函数和操作,找出需要优化的部分 网络分析– 检查图片,样式表,和脚本的加载过程,汇报它们对整个页面加载和渲染的影响 网络面板 每个资源后面的彩条将加载过程分解为组件阶段&am…...
公司内部交流 网站模板/郑州网站开发公司
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本。 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识。 一LinkedList类的定义: public class LinkedList<E>exten…...
wap网站建设/微信营销推广公司
给定 n 个不同的正整数,整数 k(k < n)以及一个目标数字 target。 在这 n 个数里面找出 k 个数,使得这 k 个数的和等于目标数字,求问有多少种方案?在线评测地址:LintCode 领扣样例1输入: Lis…...
Dedecms 手机网站示例/百度的广告推广需要多少费用
几种破解mysql root密码的几种方法: 方法一 使用phpmyadmin,这是最简单的了,修改mysql库的user表,不过别忘了使用PASSWORD函数。 方法二 使用mysqladmin,这是前面声明的一个特例。 mysqladmin -u root -p password mypasswd 输入。…...