共计 4442 个字符,预计需要花费 12 分钟才能阅读完成。
概览
Spring Boot 设计的核心理念就是对配置信息的治理采纳约定优于配置,基于此理念咱们开发过程中会大量的采纳 Spring Boot 提供的默认项,相比传统的 Spring Framework 框架大大降低的配置项的数量,本文将具体介绍基于 Spring Boot 2.x 的配置体系,包含配置文件的介绍、如何自定义配置项、如何获取配置文件中的配置项、以及如何通过 Profile 实现特定的环境应用特定的配置。
配置文件阐明
Spring Boot 应用了一个全局的配置文件 application.properties,该文件搁置在 src/main/resources 目录下,同时还反对 yaml 语言的配置文件,对应的配置文件是 application.yml。
yaml 是强调以数据为核心,而不是以标记语言为重点,能够简略表白清单、散列表,标量等数据状态,特地适宜用来表白或编辑数据结构、各种配置文件。
application 配置文件有 2 个作用,第一能够对 Spring Boot 默认的配置项进行批改,第二能够自定义配置项。
例如,Spring Boot 内嵌的 Tomcat 的默认端口 8080 批改成 9000,将上下文默认门路“/”批改为 ”/configuration”,能够在 application.properties 中增加:
server.port=9000
server.servlet.context-path=/configuration
或在 application.yml 中增加:
server:
port: 9000
servlet:
context-path: /configuration
从下面的配置能够看出,在 Spring Boot 中,context-path、contextPath、CONTEXT_PATH 模式其实是通用的。采纳 yaml 的配置性能更加弱小????,并且简洁清晰,在日常开发中,举荐应用 yaml 文件来配置。没有非凡状况阐明,下文中的所波及的配置项都会以 yaml 格局来阐明。
如何自定义配置?
Spring Boot 内置的默认配置全面且弱小,但不可能齐全咱们业务开发的须要,例如,咱们对接微信公众号开发的过程中,须要配置微信公众号的 appId 和 appSecret,这些配置项咱们个别会配置到 application.yml 中。
创立自定义配置项
-
创立一般的配置项
创立自定义的配置项和下面批改 Spring Boot 的默认配置项的形式是一样的,例如,咱们创立微信公众号的 appId 和 appSecret 两个配置项,在 application.yml 中增加:
wx: appId: 123 appSecret: xyz
-
应用占位符获取系统配置信息
想要获取系统配置信息,咱们能够应用 ${},如下获取 jdk 版本号
java: verison: ${java.version}
同样咱们能够应用雷同的形式,通过 ${} 占位符援用配置文件中的其余配置项内容,如下
system: name: configuration system: domain=health description: The system ${name} is used for ${domain}.
-
应用占位符获取 maven 变量
再来看一种场景,假如咱们应用 Maven 来构建应用程序,那么能够按如下所示的配置项来动静获取与零碎构建过程相干的信息:
info: app: encoding: @project.build.sourceEncoding@ java: source: @java.version@ target: @java.version@
-
应用占位符获取随机值
有时候咱们须要在我的项目中应用一些全局随机值,要求我的项目启动时主动生成,Spring Boot 反对在 properties、yaml 配置文件中应用相似 ${random.int} 的表达式来申明随机配置的参数:
random: #32 位随机 md5 字符串 value: ${random.value} #随机 int int: ${random.int} #随机 long long: ${random.long} #随机 uuid uuid: ${random.uuid} #随机 10 以内 int int10: ${random.int[10]} #随机取 1024 和 65535 间的 int intbetween1024and65535: ${random.int[1024,65535]}
应用 @value 注解读取配置项
在程序开发的过程中,如何在代码中应用配置文件中的配置项,咱们能够通过 @value 注入值,如下在 controller 中获取微信公众号的 appId 和 appSecret:
@RestController
public class ConfigurationController {@Value("${wx.appId}")
private String appId;
@Value("${wx.appSecret}")
private String appSecret;
@RequestMapping("/wx-info")
public String wxInfo() {return "appId:" + appId + ",appSecret:" + appSecret;}
}
这种办法会造成 contrller 有太多的配置项,针对这种状况咱们能够构建一个配置类 WxConfig,如下:
@Component
@Data
public class WxConfig {@Value("${wx.appId}")
private String appId;
@Value("${wx.appSecret}")
private String appSecret;
}
@RestController
public class WxConfigController {
@Resource
private WxConfig wxConfig;
@RequestMapping("/wx-config")
public String wxConfig() {return "appId:" + wxConfig.getAppId() + ",appSecret:" + wxConfig.getAppSecret();}
}
应用 @ConfigurationProperties 注解批量读取配置项
相较 @Value 注解,更为古代的一种做法是应用 @ConfigurationProperties 注解。在应用该注解时,咱们通常会设置一个“prefix”属性用来指定配置项的前缀,如下所示:
@Component
@Data
@ConfigurationProperties(prefix = "wx")
public class WxConfig2 {
private String appId;
private String appSecret;
}
如何多环境配置?
通过下面的介绍,咱们晓得 Spring Boot 默认的全局配置文件是 application.yml,然而在理论的开发过程中,状况就比较复杂。多环境个别指的是开发环境、测试环境、生产环境等,不同的环境对应的配置项会有不必,如果公布环境的时候,去批改配置项,不仅会节约大量工夫而且还很容易配置出错。Spring Boot 提供 Profile 机制,Profile 实质上代表一种用于组织配置信息的维度,对不同环境提供不同配置性能,能够通过激活、指定参数形式疾速切换环境。
配置文件和 Profile
通过 Profile 来实现多环境的配置有 2 种形式,第一种多配置文件,第二种是 yml 多文档块。
- 多配置文件
通过这种形式来实现的多环境配置的话,配置文件如下:
/application.yml
/application-dev.yml
/application-test.yml
/application-prod.yml -
yml 多文档块
如果你想把所有的 配置信息只保留在一个文件中而不是扩散在多个配置文件中,Spring Boot 也能够反对,须要做的事件只是对这些信息按 Profile 进行组织、分段,如下所示:
spring: profiles: dev #dev 环境相干配置信息 --- spring: profiles: test #test 环境相干配置信息 --- spring: profiles: prod #prod 环境相干配置信息 ---
只管能够在同一个配置文件中,通过文档块的形式来配置,还是举荐你按多个配置文件的组织办法治理各个 Profile 配置信息,这样才不容易混同和出错。
-
如何激活指定的 Profile
咱们能够在全局配置文件是 application.yml,通过指定配置项来激活以后的 Profile:
spring:
profiles: active: dev
还能够应用命令行的形式,在打包 jar 之后,咱们能够间接在 java –jar 命令中增加“–spring.profiles.active”参数,如下所示:
java –jar configuration-0.0.1-SNAPSHOT.jar –spring.profiles.active=prod
这种实现计划在通过脚本进行自动化打包和部署的场景下十分有用。
代码管制和 Profile
在 Spring Boot 中,Profie 这个一概念的还能够动静的控制代码的执行流程,如下:
@Configuration
public class DataSourceConfig {
@Bean
@Profile("dev")
public DataSource devDataSource() {// 创立 dev 环境下的 DataSource}
@Bean
@Profile("test")
public DataSource devDataSource() {// 创立 test 环境下的 DataSource}
@Bean()
@Profile("prod")
public DataSource prodDataSource(){// 创立 prod 环境下的 DataSource}
}
能够看到,咱们构建了一个 DataSourceConfig 配置类来专门治理各个环境所需的 DataSource。这里用 @Profile 注解来指定了不同的环境,执行创立 DataSource 的逻辑代码。
@Profile 注解的利用范畴很广,咱们能够将它增加到蕴含 @Configuration 和 @Component 注解的类及其办法,也就是说能够延长到继承了 @Component 注解的 @Service、@Controller、@Repository 等各种注解中。
我的项目源码
github: https://github.com/dragon8844/springboot-learning/tree/main/configuration
最初说一句
如果这篇文章对您有所帮忙,或者有所启发的话,帮忙关注一下,您的反对是我保持写作最大的能源,多谢反对。
此外,关注公众号:彩色的灯塔,专一 Java 后端技术分享,涵盖 Spring,Spring Boot,SpringCloud,Docker,Kubernetes 中间件等技术。