深入理解Spring Boot配置文件的高级用法

一、Spring Boot配置文件基础

1.1 常用配置文件格式

Spring Boot支持两种配置文件格式:propertiesYAML

1.1.1 Properties格式

application.properties 文件是最常见的配置文件格式。它以键值对的形式配置内容,格式简单直观。

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
1.1.2 YAML格式

application.yml 文件使用YAML格式,它通过缩进和层次结构组织配置内容,更加清晰易读,尤其是在管理复杂的嵌套配置时。

server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/mydb

1.2 配置文件的加载顺序

Spring Boot允许在不同的环境中使用不同的配置文件。配置文件的加载顺序如下:

  1. 命令行参数:最高优先级。
  2. application.propertiesapplication.yml 文件:存在于类路径下的文件。
  3. @PropertySource 注解:显式加载的外部配置文件。
  4. 默认配置:例如 application.properties 文件中的默认配置。

此外,Spring Boot支持通过 spring.profiles.active 属性来激活不同的环境配置文件,例如 application-dev.propertiesapplication-prod.properties

二、高级配置文件用法

2.1 多环境配置

在实际开发中,我们通常会根据不同的环境(开发、测试、生产)使用不同的配置。Spring Boot通过 profile 特性简化了多环境配置的管理。

2.1.1 定义多环境配置文件

你可以为不同的环境创建不同的配置文件,例如 application-dev.ymlapplication-prod.yml

# application-dev.yml
server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/devdb
# application-prod.yml
server:port: 80
spring:datasource:url: jdbc:mysql://localhost:3306/proddb
2.1.2 激活特定环境

可以通过以下几种方式激活某个环境的配置文件:

  • 在命令行参数中指定:--spring.profiles.active=prod
  • application.properties 文件中设置:spring.profiles.active=prod
  • 在操作系统环境变量中设置:SPRING_PROFILES_ACTIVE=prod
2.1.3 合并多环境配置

在多环境配置中,Spring Boot会首先加载 application.ymlapplication.properties 中的默认配置,然后加载对应的环境配置。环境配置中的内容会覆盖默认配置。

# application.yml
server:port: 8080
spring:datasource:username: root
# application-prod.yml
spring:datasource:url: jdbc:mysql://localhost:3306/proddbusername: admin  # 覆盖默认配置中的username

2.2 配置属性的外部化

Spring Boot支持将配置属性外部化,以便在不同的环境中动态调整配置。外部化配置可以通过环境变量、命令行参数、以及其他外部配置文件实现。

2.2.1 环境变量

Spring Boot可以自动读取系统环境变量,并将其作为配置属性。

export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/externaldb

在应用程序中可以直接使用:

spring.datasource.url=${SPRING_DATASOURCE_URL}
2.2.2 命令行参数

可以通过命令行参数传递配置项:

java -jar myapp.jar --server.port=9090
2.2.3 外部配置文件

你可以将配置文件存储在外部目录,并通过 spring.config.location 属性指定该配置文件的路径。

java -jar myapp.jar --spring.config.location=/path/to/external-config/

2.3 配置文件中的占位符与SpEL表达式

Spring Boot的配置文件支持使用占位符(${})和Spring表达式语言(SpEL)进行动态配置。

2.3.1 占位符

占位符可以用于引用配置文件中的其他属性,甚至是系统环境变量。

app.name=MyApp
app.description=${app.name} 是一个Spring Boot应用程序
app:name: MyAppdescription: ${app.name} 是一个Spring Boot应用程序
2.3.2 SpEL表达式

Spring Boot还支持在配置文件中使用SpEL表达式,可以动态计算配置值。

app.port=${server.port:8080}  # 使用server.port,如果未定义则默认8080
app.name=MyApp
app.fullname=#{app.name + ' Application'}
app:name: MyAppfullname: "#{app.name + ' Application'}"

2.4 自定义配置属性

除了使用Spring Boot提供的默认配置属性外,你还可以根据业务需求自定义配置属性,并通过注解将这些属性注入到Java类中。

2.4.1 定义自定义属性

首先,在配置文件中定义自定义属性:

myapp:url: https://www.example.comfeature:enabled: true
2.4.2 创建配置类

然后,在Java类中创建一个配置类,将配置文件中的自定义属性绑定到该类中:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {private String url;private Feature feature;// Getter和Setter方法public static class Feature {private boolean enabled;// Getter和Setter方法}
}
2.4.3 使用自定义属性

最后,在其他组件中注入并使用这个配置类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyAppController {@Autowiredprivate MyAppProperties myAppProperties;@GetMapping("/config")public String getConfig() {return "URL: " + myAppProperties.getUrl() +", Feature Enabled: " + myAppProperties.getFeature().isEnabled();}
}

2.5 加密敏感信息

在实际应用中,有些配置信息是敏感的,例如数据库密码、API密钥等。这些信息不应该以明文形式存储在配置文件中。Spring Boot提供了几种加密敏感信息的方法。

2.5.1 使用Jasypt加密

Jasypt(Java Simplified Encryption)是一个简单的加密库,可以很方便地与Spring Boot集成。

  1. 添加依赖
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version>
</dependency>
  1. 配置加密属性

使用Jasypt加密工具加密敏感信息,例如数据库密码:

# 加密命令示例
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \input="mysecretpassword" password="encryptionkey" algorithm="PBEWithMD5AndDES"

将生成的密文放入配置文件中,并使用 ENC() 包裹:

spring.datasource.password=ENC(j5dJ7d5RzQ==)
  1. 配置解密密钥

通过命令行或环境变量传递解密密钥:

java -jar myapp.jar --jasypt.encryptor.password=encryptionkey
2.5.2 使用Spring Cloud Config加密

如果你的项目使用了Spring Cloud Config,那么可以利用它的加密功能。你只需要在配置服务器中启用加密,并将敏感信息加密后存储在远程配置库中。

2.6 动态刷新配置

Spring Boot的默认配置加载机制要求在启动时加载配置文件,这意味着应用运行时不能动态更新

配置。不过,Spring Cloud的 Spring Cloud ConfigSpring Cloud Bus 提供了动态刷新配置的能力。

2.6.1 使用Spring Cloud Config

首先,确保你的项目已经集成了Spring Cloud Config,并且配置服务器已设置好。

  1. 添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  1. 启用动态刷新

在需要动态刷新的配置类上添加 @RefreshScope 注解:

import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RefreshScope
public class MyAppController {// 你的代码...}
  1. 触发刷新

配置更改后,通过 POST 请求 /actuator/refresh 端点触发刷新。

curl -X POST http://localhost:8080/actuator/refresh

2.7 高级日志配置

日志是应用程序的关键部分,Spring Boot提供了丰富的日志配置支持。你可以在 application.propertiesapplication.yml 文件中配置日志级别、输出格式等。

2.7.1 配置日志级别

Spring Boot默认使用 logback 作为日志框架,你可以通过 logging.level 属性设置日志级别。

logging.level.root=INFO
logging.level.com.example=DEBUG
2.7.2 自定义日志格式

你可以通过配置 logback-spring.xml 文件来自定义日志格式。该文件需要放置在 src/main/resources 目录下。

<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="STDOUT" /></root>
</configuration>

2.8 处理多语言配置

在国际化应用中,需要根据用户的语言环境动态切换应用显示的语言。Spring Boot通过 MessageSource 和资源文件支持多语言配置。

2.8.1 配置资源文件

src/main/resources 目录下创建不同语言的资源文件,例如 messages.properties(默认)、messages_zh_CN.properties(中文)。

# messages.properties
greeting=Hello, {0}!# messages_zh_CN.properties
greeting=你好, {0}!
2.8.2 配置MessageSource

在Spring配置类中定义 MessageSource Bean:

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;@Configuration
public class MessageConfig {@Beanpublic MessageSource messageSource() {ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();messageSource.setBasename("classpath:messages");messageSource.setDefaultEncoding("UTF-8");return messageSource;}
}
2.8.3 使用国际化资源

在应用中,通过 MessageSource 获取国际化信息:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Locale;@RestController
public class GreetingController {@Autowiredprivate MessageSource messageSource;@GetMapping("/greet")public String greet(@RequestParam(name = "name", defaultValue = "World") String name, Locale locale) {return messageSource.getMessage("greeting", new Object[]{name}, locale);}
}

通过不同的 Accept-Language 头请求,可以获取对应语言的问候语。

三、总结

Spring Boot配置文件的高级用法为应用程序的灵活配置和管理提供了强大的支持。无论是多环境配置、外部化属性、加密敏感信息,还是动态刷新配置和国际化支持,这些特性都使得Spring Boot能够更好地适应各种复杂的应用场景。掌握这些高级用法,将帮助你构建更加健壮、灵活和可维护的Spring Boot应用程序。

在实际项目中,你可以根据需求灵活运用这些配置技巧,不断优化应用的配置管理方式,为你的Spring Boot项目保驾护航。

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

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

相关文章

报错记录1:imx6ull适配ov2640摄像头报错unknown mbus:xxx

文章目录 报错内容报错代码报错原因 解决 报错内容 [ 376.346236] unknown mbus:0x1007 [ 376.350166] mx6s-csi 21c4000.csi: mbus (0x00001007) invalid.报错代码 在mx6s_capture.c文件中&#xff0c;找到此行报错的调用路径。 static int mx6s_vidioc_enum_fmt_vid_cap…

已成功入职小米大模型岗!!大模型面试其实挺水的,hr听到这些直接过

小米大模型面试180题 1、目前比较受欢迎的开源大模型有哪些&#xff1f; GPT系列&#xff1a;由OpenAl开发的生成式预训练模型&#xff0c;如 GPT-3。 BERT系列&#xff1a;由Google开发的转换式预训练模型&#xff0c;如BERT、RoBERTa等。 T5系列&#xff1a;由Google开发的基…

003、架构_详解(重点)

GoldenDB 分布式数据库框架 DN和RDB增加了备节点;引入新模块CM,且GTM、MDS、PM、CM都增加备节点;MDS、PM、CM、RDB被统一在了管理节点之中;GTM和MDS间多了一条连线,因为GTM的切换由MDS把控;初步系统架构mysqld:一般称为DB节点,负责单个节点的数据处理; dbproxy:一般…

CSS学习3

样式表 一、内部样式表二、行内样式表&#xff08;内联样式&#xff09;三、外部样式表&#xff08;外链样式&#xff09;总结 一、内部样式表 在html内部成为内部样式表&#xff0c;用style标签定义。 可以放在html任何地方&#xff0c;包括html标签外部。 <html><…

Gitee上传项目(从0开始)

1.默认你Git已经下载好的情况下。 下载好的两种显示&#xff1a; 1.右击桌面显示这个 2.如果没有情况1出现&#xff0c;需要自己去创建快捷方式 2.去网站创建仓库 网站参考&#xff1a;yanyongzhitest/java_web - 码云 - 开源中国 (gitee.com) 新建仓库&#xff1a; 仓库名…

day_59

47. 参加科学大会&#xff08;第六期模拟笔试&#xff09; import queueclass Edge:def __init__(self, t, w):self.t t self.w w def main():n, m map(int, input().split())grid [[] for _ in range(n 1)]for _ in range(m):s, t, w map(int, input().split())grid[s]…

Nginx负载均衡请求队列配置:优化流量管理

在高流量的Web应用场景中&#xff0c;合理地管理进入的请求流量对于保持服务的稳定性和响应性至关重要。Nginx提供了请求队列的配置选项&#xff0c;允许开发者控制进入后端服务器的请求数量。通过配置请求队列&#xff0c;可以在后端服务器达到最大处理能力时&#xff0c;优雅…

【计算机组成原理】3.2.0+3.2.3 主存储器的基本组成

3.2.03.2.3 主存储器的基本组成 00:00 各位同学大家好&#xff0c;在这个小节中我们会学习主存储器的基本组成。这个小节的内容本来是在王道书里的3.3那个小节&#xff0c;但是我们会把这部分的内容把它提到3.2之前来讲解。因为学习这个小节的内容&#xff0c;可以让大家能够…

版本管理工具 Git 的下载安装及使用

1 基本介绍 Git 是目前最流行的分布式版本控制软件 什么是分布式版本控制软件&#xff1f; 所有版本信息仓库全部同步到本地的每个用户可以在本地查看所有版本历史&#xff0c;可以离线在本地提交&#xff0c;只需在连网时 push 到相应的服务器或其他用户那里。每个用户那里…

滑动窗口系列(定长滑动窗口长度)8/31

1.长度为K子数组中的最大和 给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和&#xff1a; 子数组的长度是 k&#xff0c;且子数组中的所有元素 各不相同 题意&#xff1a; 在之前题目的基础上添加了一个条件&#xff1a;…

22. LinkedHashMap和HashMap有什么区别?为什么LinkedHashMap能保持元素的插入顺序?

LinkedHashMap 和 HashMap 都是 Java 中用于存储键值对的集合类&#xff0c;但它们在一些关键特性上有所不同&#xff0c;尤其是在元素的顺序和性能方面。以下是它们之间的主要区别&#xff1a; 1. 元素的顺序 HashMap: HashMap不保证元素的顺序。元素的顺序可能会在插入、删除…

453.最小操作次数使数组元素相等

453.最小操作次数使数组元素相等 给你一个长度为 n 的整数数组&#xff0c;每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;3 解释&#xff1a; 只需要3次操作&#xff08;…

全国设计院排名 境外工程项目管理营业额二〇二三年排名

境外工程项目管理营业额二〇二三年排名 单位&#xff1a;万元人民币 序号 公 司 名 称 营业额 1 中国铁路设计集团有限公司 37,515 2 中冶南方工程技术有限公司 12,453 3 中国恩菲工程技术有限公司 8,940 4 中冶华天工程技术有限公司 7,646 5 中国电建集团华东…

为什么echarts极坐标柱形图的图形显示的特别小呢??如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

最新Vmware17的WIn10虚拟机开箱即用,免安装

这篇文章分享的Vmware安装Win10的教程&#xff0c;如过有些懒得装Win10的同学可以会直接使用我的WIn10镜像压缩包打开即可 Win10镜像压缩包下载 tips&#xff1a;⬆️⬆️包含Vmware17安装包 使用方法&#xff0c;打开Vmware

皕盛电商平台:为合作伙伴提供广阔的发展空间

随着互联网的快速发展&#xff0c;我国电商行业已经取得了显著的成果&#xff0c;越来越多的企业和个人投身于电商领域。在众多电商平台中&#xff0c;皕盛电商平台以其独特的方式&#xff0c;为消费者、商家和合作伙伴创造了一个全新的电商生态圈。 一、关于皕盛电商平台 皕…

Redis集群搭建以及用idea连接集群

一、redis的集群搭建&#xff1a; 判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数&#xff0c;搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。…

零基础学习Redis(7) -- hash类型命令使用

Redis本身就是通过哈希表的方式组织数据&#xff0c;同时redis中的value也可以是另一个哈希表。 1. 常用命令 1. hset / hsetnx hset key filed1 value1 filed2 value2 ... hset 用于把键值对存入value中&#xff0c;这里的key为redis组织的键&#xff0c; filed1 value1 fil…

JavaWeb笔记整理10——JWT令牌、Filter、Interceptor

目录 1.简介 2.生成和校验 3.登录-生成令牌 4.过滤器Filter 快速入门 Filter执行流程 Filter拦截路径 过滤器链 登录校验Filter 流程 代码 5.拦截器Interceptor 快速入门 Interceptor拦截路径 执行流程 代码 继笔记04-session cookie 1.简介 2.生成和校验 /*…

【秋招笔试】8.31京东秋招(研发岗)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…