解锁Spring Boot的强大配置功能:@ConfigurationProperties与@PropertySources详解

简介: 解锁Spring Boot的强大配置功能:@ConfigurationProperties与@PropertySources详解


前言

在当今的软件开发世界中,配置管理是至关重要的一部分。Spring框架为我们提供了多种配置方式,其中@ConfigurationProperties和@PropertySources是强大的工具,可以帮助我们轻松管理应用程序的配置信息。本博客将深入探讨这两个关键注解,介绍它们的用途以及如何在Spring应用程序中使用它们。无论你是新手还是经验丰富的开发者,这篇博客都将为你提供有关配置文件管理的深入知识,帮助你编写更具可维护性和可扩展性的代码。

什么是@ConfigurationProperties和@PropertySources

@ConfigurationProperties@PropertySources 都是与属性配置相关的注解,用于在 Spring 应用程序中管理和加载配置信息。

  1. @ConfigurationProperties:
  • @ConfigurationProperties 是 Spring Boot 中的一个注解,用于将配置文件中的属性值绑定到 Java Bean 上。通常,这个注解用于将外部属性文件中的属性值映射到应用程序的配置类中,以便在整个应用程序中方便地访问和使用这些属性。
  • 这个注解通常与 @Configuration@Component 一起使用,以将配置属性绑定到一个特定的 Java Bean。通过在类上使用 @ConfigurationProperties,您可以将属性文件中的键与 Java Bean 的字段或属性进行映射。
  1. 示例:
@Configuration
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
    private String name;
    private String version;
    // getters and setters
}
  1. 在上述示例中,@ConfigurationProperties 注解将以 myapp 前缀开头的属性映射到 MyAppProperties 类的字段中。
  2. @PropertySources:
  • @PropertySources 是 Spring Framework 中的注解,用于指定多个属性源,以便在 Spring 应用程序中解析属性。每个属性源可以是一个属性文件,用于存储配置信息。与 @PropertySource 类似,@PropertySources 允许您在多个地方定义属性源,以便将配置信息分散在不同的文件中。
  • 这个注解通常与 @Configuration 一起使用,以将多个属性源引入 Spring 应用程序的环境中。
  1. 示例:
@Configuration
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:custom.properties")
})
public class AppConfig {
    // 这里可以注入和使用从属性文件加载的配置属性
}
  1. 在上述示例中,@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 App
  version: 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;
    @Autowired
    public 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;
    @Autowired
    public 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。它们可以一起使用,以实现更灵活和模块化的配置管理。

相关文章
|
8天前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
52 2
|
16天前
|
XML 前端开发 Java
SpringBoot实现文件上传下载功能
本文介绍了如何使用SpringBoot实现文件上传与下载功能,涵盖配置和代码实现。包括Maven依赖配置(如`spring-boot-starter-web`和`spring-boot-starter-thymeleaf`)、前端HTML页面设计、WebConfig路径映射配置、YAML文件路径设置,以及核心的文件上传(通过`MultipartFile`处理)和下载(利用`ResponseEntity`返回文件流)功能的Java代码实现。文章由Colorful_WP撰写,内容详实,适合开发者学习参考。
|
28天前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
78 0
|
8天前
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
32 4
|
16天前
|
存储 Java 定位技术
SpringBoot整合高德地图完成天气预报功能
本文介绍了如何在SpringBoot项目中整合高德地图API实现天气预报功能。从创建SpringBoot项目、配置依赖和申请高德地图API开始,详细讲解了实体类设计、服务层实现(调用高德地图API获取实时与预报天气数据)、控制器层接口开发以及定时任务的设置。通过示例代码,展示了如何获取并处理天气数据,最终提供实时天气与未来几天天气预报的接口。文章还提供了测试方法及运行步骤,帮助开发者快速上手并扩展功能。
|
28天前
|
Java 数据库连接 数据库
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
104 0
|
28天前
|
缓存 Java 应用服务中间件
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——依赖导入和Thymeleaf相关配置
在Spring Boot中使用Thymeleaf模板,需引入依赖`spring-boot-starter-thymeleaf`,并在HTML页面标签中声明`xmlns:th="http://www.thymeleaf.org"`。此外,Thymeleaf默认开启页面缓存,开发时建议关闭缓存以实时查看更新效果,配置方式为`spring.thymeleaf.cache: false`。这可避免因缓存导致页面未及时刷新的问题。
39 0
|
11月前
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
1183 0
|
XML Java 数据库连接
【Spring学习笔记 五】Spring注解及Java类配置开发
【Spring学习笔记 五】Spring注解及Java类配置开发
117 0
|
XML Java 数据格式
Spring学习笔记:02 spring配置
Spring学习笔记:02 spring配置