概览

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=9000server.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:

@RestControllerpublic 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@Datapublic class WxConfig {        @Value("${wx.appId}")    private String appId;        @Value("${wx.appSecret}")    private String appSecret;}@RestControllerpublic 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这个一概念的还能够动静的控制代码的执行流程,如下:

@Configurationpublic 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中间件等技术。