当前位置: 首页 > news >正文

解锁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 应用程序中管理和加载配置信息。

  1. @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 类的字段中。

  2. @PropertySources:

    • @PropertySources 是 Spring Framework 中的注解,用于指定多个属性源,以便在 Spring 应用程序中解析属性。每个属性源可以是一个属性文件,用于存储配置信息。与 @PropertySource 类似,@PropertySources 允许您在多个地方定义属性源,以便将配置信息分散在不同的文件中。
    • 这个注解通常与 @Configuration 一起使用,以将多个属性源引入 Spring 应用程序的环境中。

    示例:

    @Configuration
    @PropertySources({@PropertySource("classpath:application.properties"),@PropertySource("classpath:custom.properties")
    })
    public class AppConfig {// 这里可以注入和使用从属性文件加载的配置属性
    }
    

    在上述示例中,@PropertySources 注解指定了两个属性源,分别是 application.propertiescustom.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.namemyapp.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.propertiesapplication.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.propertiesapplication.yml 更为常见。不过,我可以提供一个示例,演示如何在 Spring Boot 中使用 @PropertySources 注解来指定多个属性源。

以下是一个示例:

  1. 创建一个 Spring Boot 项目。

  2. 创建一个配置类,例如 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.propertiescustom.properties。这两个属性源位于类路径下,可以包含不同的配置属性。

  1. 创建属性文件 default.propertiescustom.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
  1. 创建一个服务类,例如 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.nameapp.version,这些属性的值将从属性源中获取。

  1. 创建一个控制器类,例如 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();}
}
  1. 启动应用程序,并访问 /app-info 路径,您将看到根据不同属性源获取的应用程序信息。

在这个示例中,我们使用了 @PropertySources 注解来指定多个属性源,并在服务类中使用 @Value 注解来注入属性。这使得应用程序能够根据属性源的不同而获取不同的属性值。不过需要注意,在 Spring Boot 中,通常更常见的做法是使用默认的 application.properties(或 application.yml)文件以及 @ConfigurationProperties 注解来管理配置属性。

@PropertySources与@ConfigurationProperties的区别

@PropertySources 注解是 Spring 框架中用于指定多个属性源的注解。它的主要作用是允许您在 Spring 应用程序中定义多个属性源,以便在不同位置或不同配置文件中存储和管理配置属性。这有助于将配置信息分散在多个文件中,使应用程序更加模块化和可维护。下面详细介绍 @PropertySources 注解的作用以及与 @ConfigurationProperties 的关系:

@PropertySources 注解的作用:

  1. 指定多个属性源: @PropertySources 允许您在一个配置类中指定多个属性源,每个属性源对应一个属性文件。这些属性源可以包含应用程序的配置信息,如数据库连接参数、日志级别、服务端口等。

  2. 模块化配置: 通过将配置信息分散在多个属性文件中,您可以将应用程序的配置模块化,使每个模块负责自己的配置。这使得代码更易于维护和理解,特别是在大型应用程序中。

  3. 环境适应性: 您可以为不同的环境(如开发、测试、生产)或不同的配置需求定义不同的属性源。这使得应用程序能够在不同环境中使用不同的配置,而不必修改代码。

  4. 属性源优先级: 如果存在多个属性源,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++ - 右值引用 和 移动拷贝

右值引用 我们先来了解什么是左值&#xff0c;什么是右值&#xff1a; 左值 和 有值 区分 首先&#xff0c;左值 和 右值 并不是完全意味着 在 "" 左边的就是 左值 &#xff1b; 在 "" 右边的就是右值。这是不一定的。只能说&#xff0c;在左边的大概率是…...

项目成员积分规则

在当下的项目/团队管理种&#xff0c;如何让成员能清晰的看到&#xff0c;自己的工作、努力在团队种属于那个段位&#xff0c;通过这个形式&#xff0c;并配合其他方式去点燃成员的进步之心。以积分的形式&#xff0c;代替绩效考核&#xff0c;一些零散的想法&#xff0c;欢迎各…...

Linux CentOS7 vim多窗口编辑

我们在用vim编辑文件时&#xff0c;有各种需求。如有时需要在多个文件之间来回操作&#xff0c;一会关闭一个文件&#xff0c;一会再打开另外一个文件&#xff0c;这样来回操作显得太笨拙。有时&#xff0c;vim编辑多行的大文件&#xff0c;来回查看、编辑前面一部分及最后一部…...

git使用,一点点

查看自己有没有安装git git --version 如果没有安装请执行sudo yum install -y git来安装 git 指令 git log 查看日志 git pull 同步远端和本地仓库 这就是冲突的报错&#xff1a; 所以这个时候你要同步一下git pull...

第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第八节 - 如何在 C/C++、Python 和 Java 中分割字符串?)

通过某些分隔符分割字符串是一项非常常见的任务。例如,我们有一个文件中以逗号分隔的项目列表,并且我们希望数组中包含各个项目。 几乎所有编程语言都提供按某些分隔符分割字符串的函数。 目录 在C中: 在 C++ 中 方法一:使用C++的stringstream API...

【Java】语法特性篇

语法特性篇 Java对象的比较 1. 对象比较的问题 Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较。那为什么可以比较&#xff1f; 因为&#xff1a;对于用户实现自定义类型&#xff0c;都默认继承自Object类&#xff0c;而Object类中提供了equal方法&#xf…...

Vim教程

目录 vim 介绍 常用的四种模式 首先先学会如何正确进入和退出vim&#xff1a; normal模式 insert模式&#xff1a; command模式&#xff1a; v-block模式&#xff1a; vim异常退出 vim配置 vim 介绍 Vim是一款高度可定制的文本编辑器&#xff0c;它的前身是Vi&#xf…...

selenium查找网页如何处理网站资源一直加载非常卡或者失败的情况

selenium查找网页如何处理网站资源一直加载失败的情况 selenium获取一个网页&#xff0c;某个网页的资源卡了很久还没有加载成功&#xff0c;如何放弃这个卡的数据&#xff0c;继续往下走 有2钟方式。通常可以采用下面的方式一来处理这种情况 方式一、WebDriverWait 这种方式…...

并发工具类库使用的常见问题

一、ThreadLocal在多线程环境中没有清理 由于ThreadLocal是和线程绑定的&#xff0c;如果线程被复用了&#xff0c;也即使用了线程池&#xff0c;那么ThreadLocal中的值是可能被复用的&#xff0c;这个特性如果是开发者没有预料到的&#xff0c;那么会产生很大的问题。例如&am…...

GD32F10X ----RTC

1. RTC的简介 STM32 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置…...

使用UiPath和AA构建的解决方案 1. 机器人过程自动化入门

你好!在这本系列,我们将指导您完成一些真实世界的机器人过程自动化(RPA)项目。感谢您的加入。当你完成本系列时,你将具备使用UiPath和Automation Anywhere在最低指导下进行简单到中等复杂度RPA项目的知识、技术和心态。 RPA是一项令人兴奋的新技术,被视为使用新的先进技…...

rust字面量

字面量就是值。值最终必须编码成二进制存储在某块内存上。 变量与字面量的关系就像杯子和水的关系。 字面量是有类型的。字面量类型有&#xff1a;布尔、数字、文本、字节 一、布尔 类型是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 =...

打造完美家庭空间,让生活更加舒适

在现代繁忙的都市生活中&#xff0c;家是人们温暖而舒适的避风港。而如何打造一个恰到好处的家庭空间&#xff0c;成为了许多人心中的追求。今天&#xff0c;就让我们来探索一些空间布局方案&#xff0c;为您的家庭营造一个完美融合功能与美感的舒适空间。 &#x1f3e0;&…...

解决loadDep:omelette: sill install loadAllDepsIntoIdealTree

报错信息如下&#xff1a; 解决方案&#xff1a; 1、设置为淘宝的镜像源 npm config set registry https://registry.npm.taobao.org 2、 命令检验是否成功 npm config get registry 3、继续运行npm install即可 npm install 运行效果&#xff1a;...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...