SpringBoot配置方法有哪些

本篇內(nèi)容介紹了“Spring Boot配置方法有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供金鳳網(wǎng)站建設(shè)、金鳳做網(wǎng)站、金鳳網(wǎng)站設(shè)計(jì)、金鳳網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、金鳳企業(yè)網(wǎng)站模板建站服務(wù),十年金鳳做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

一、概述

目前Spring Boot版本: 2.3.4.RELEASE,這更新的速度也是嗖嗖的了,隨著新版本的發(fā)布,也一步步針對(duì)公司基礎(chǔ)組件進(jìn)行了升級(jí)改造,其中很重要的一塊就是配置文件的更新(雖然目前已經(jīng)全部使用了Apollo)。針對(duì)Spring Boot 新版本的配置文件也做了一次梳理,確實(shí)發(fā)現(xiàn)了以前沒有注意到的點(diǎn)。

二、新版的外部配置

1、基礎(chǔ)配置加載

Spring Boot 為我們提供了很多的外部配置參數(shù),我們可以使用 YAML 文件(當(dāng)然你也可以使用properties,但不建議)、環(huán)境變量和命令行參數(shù),來區(qū)分不同的環(huán)境配置。

使用配置有兩種方式:

  • 使用注解@Value,來注入Environment 里面包含的屬性

  • 使用@ConfigurationProperties 來定義一個(gè)屬性類,來包含我們需要的屬性(這些屬性都可以配置在YAML中)

Spring Boot 外部配置這么多,那如果都配置了哪個(gè)會(huì)生效呢?

Spring Boot會(huì)以下面的順序來加載配置,優(yōu)先級(jí)從高到低(相同配置優(yōu)先級(jí)高的會(huì)覆蓋低的),從外到里的來進(jìn)行配置覆蓋加載:

1)開發(fā)者全局配置的properties文件(當(dāng)開發(fā)者工具激活時(shí),文件在$HOME/.config/spring-boot下的spring-boot-devtools.properties)

2)測(cè)試中配置了@TestPropertySource("base.properties") 注解來加載的配置,比如base.properties這種

3)測(cè)試中 使用了@SpringBootTest的 properties

4)命令行參數(shù)配置,也就是java -jar后面使用的配置

5)可以使用SPRING_APPLICATION_JSON屬性加載的SON配置,加載方式有兩種:

  • 在系統(tǒng)環(huán)境變量加載 SPRING_APPLICATION_JSON='{"persion":{"name":"xxx"}}',這種加載會(huì)將這個(gè)數(shù)據(jù)加到Spring Environment中,我們可以獲得一個(gè)persion.name 的屬性,值為xxx

  • 使用System屬性加載 java -Dspring.application.json='{"persion":{"name":"xxx"}}' -jar app.jar,這種加載方式會(huì)將spring.application.json屬性的值當(dāng)做一個(gè)String來加載,不會(huì)解析。

6)ServletConfig 初始化的配置

7)ServletContext初始化的配置

8)java:comp/env的JNDI特性

9)Java的系統(tǒng)屬性,就是System.getProperties() 獲取到的這些

10)操作系統(tǒng)配置的環(huán)境變量

11)在RandomValuePropertySource中配置的以random. 開頭的屬性

12)應(yīng)用外部配置的 application-{profile}.properties或YAML ,可以使用spring.profiles.active 來選擇配置的環(huán)境,不選擇默認(rèn)就是application-default.properties。我們可以使用spring.config.location 來定義文件的路徑進(jìn)行加載。

13)在你應(yīng)用內(nèi)部配置的application-{profile}.properties 或 YAML,也是用于多環(huán)境加載選擇使用,可以用spring.profiles.active 來激活配置

14)應(yīng)用外部配置的application.properties或 YAML

15)應(yīng)用內(nèi)部配置的application-{profile}.properties 或 YAML。

這里14、和15 的 SpringApplication 會(huì)從application.properties來進(jìn)行配置屬性的加載。

這個(gè)配置會(huì)從四個(gè)位置按照優(yōu)先級(jí)從高到低的方式覆蓋加載,高優(yōu)先級(jí)覆蓋低優(yōu)先級(jí)的,來看下:

  • 應(yīng)用外部當(dāng)前目錄里 /config 文件夾下的 application.properties 或者application.yml

  • 應(yīng)用外部當(dāng)前目錄里的 application.properties 或者application.yml

  • 應(yīng)用內(nèi)部classpath下的/config ,也就是resources/config 目錄下的 application.properties 或者application.yml

  • 應(yīng)用內(nèi)部classpath下,也就是resources 目錄下的application.properties 或者application.yml

16)@Configuration 配置類上配置了 @PropertySource注解的,但在spring 上下文刷新前這個(gè)配置是不會(huì)被加載到Environment里面的。這種加載方式不能配置那些應(yīng)用上下文刷新前就需要加載的屬性,比如logging.* 和spring.main.* 這種。

使用方式:

 //這里加載classpath:/com/myco/app.properties文件
@Configuration
 @PropertySource("classpath:/com/myco/app.properties")
 public class AppConfig {

     @Autowired
     Environment env;

     @Bean
     public TestBean testBean() {
         TestBean testBean = new TestBean();
         testBean.setName(env.getProperty("testbean.name"));
         return testBean;
     }
 }

17)SpringApplication.setDefaultProperties 設(shè)置的參數(shù)

下面來用一個(gè)Demo 說下:

import org.springframework.stereotype.*;
import org.springframework.beans.factory.annotation.*;

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}
  • 你可以使用 classpath 下的application.yml來配置name= laowang

  • 可以使用一個(gè)外部的application.yml 來設(shè)置一個(gè)name = laoli 覆蓋上一個(gè)配置 (當(dāng)前name 獲取的話是laoli)

  • 在可以使用java -jar app.jar --name="Spring" 在來覆蓋上一個(gè)配置 (當(dāng)前name獲取的話是 Spring)

Spring Boot 配置文件也支持通配符的方式來加載,比如使用 spring.config.additional-location和spring.config.location來加載配置的時(shí)候就可以使用通配符加載多個(gè)文件。

2、配置隨機(jī)屬性

隨機(jī)屬性的注入其實(shí)是通過RandomValuePropertySource 來實(shí)現(xiàn)的,它可以幫我們來產(chǎn)生integers、 longs、 uuid、strings 的隨機(jī)值。這個(gè)對(duì)于我們平時(shí)進(jìn)行一些測(cè)試案例還是很實(shí)用的。

//可以配置在application.yml
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

3、命令行屬性

我們可以使用 java -jar --server.port=9000的方式將命令行參數(shù)server.port 添加到我們應(yīng)用的Environment,可以使用@Value等方式獲取。正常情況下命令行添加的屬性優(yōu)先級(jí)是咱們優(yōu)先級(jí)高的。

如果你不想將命令行的屬性添加到應(yīng)用的Environment中,那你可以配置SpringApplication.setAddCommandLineProperties(false)就行了。

其實(shí)使用命令行加載最多的可能就是--javaagent 這個(gè)屬性了,對(duì)于現(xiàn)在的公司,APM監(jiān)控那是必不可少的。我們也可以通過命令參數(shù)的配置來臨時(shí)的加載一些屬性進(jìn)行測(cè)試使用。

4、應(yīng)用加載配置文件

其實(shí)上面已經(jīng)說過了,這里在重新提一下。SpringApplication 會(huì)從application.yml里面加載屬性配置,并將他們添加到Spring 的Environment中供我們使用。優(yōu)先級(jí)如下,高優(yōu)先級(jí)覆蓋低的(這里放個(gè)原版,可以自己嘗試?yán)斫庀拢?/p>

  1. A /config subdirectory of the current directory

  2. The current directory

  3. A classpath /config package

  4. The classpath root

如果你不喜歡配置文件叫做application.properties,也可以使用spring.config.name來進(jìn)行配置。也可以使用spring.config.location 來指定配置加載路徑。

舉例說明:

//修改我的配置文件叫myproject
java -jar myproject.jar --spring.config.name=myproject
  
  
//換一個(gè)地方來加載我得配置文件
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

因?yàn)閟pring.config.name 和 spring.config.location 配置是用來確定應(yīng)用需要加載哪些屬性的,所以需要盡可能早的加載。一般都是使用系統(tǒng)環(huán)境變量、系統(tǒng)參數(shù)、命令行加載的方式進(jìn)行使用。

默認(rèn)的配置加載路徑如下,安裝優(yōu)先級(jí)從高到低排序(file:./config/ 優(yōu)先級(jí)最高),所以在使用加載的時(shí)候一定要注意:

  1. file:./config/

  2. file:./config/*/

  3. file:./

  4. classpath:/config/

  5. classpath:/

5、占位符的使用

在application.properties 我們可以使用占位符來進(jìn)行屬性的動(dòng)態(tài)加載

比如我們可以借助maven 的profile 在打包的時(shí)候動(dòng)態(tài)的對(duì)環(huán)境參數(shù)進(jìn)行替換(比如替換MySQL 、redis等域名)

上幾個(gè)例子:

//簡(jiǎn)單的使用
app.name=MyApp
app.description=${app.name} is a Spring Boot application
  
//配合命令行參數(shù)使用,如參數(shù)增加 --port=9000 來代替--server.port=9000,那在配置文件中我們就可以配置
server.port=${port:8080}

注意一點(diǎn):

如果你的POM 里面集成了spring-boot-starter-parent ,那么默認(rèn)的maven-resources-plugins插件會(huì)使用@maven.token@來代替${maven.token}。這么做其實(shí)是為了防止和Spring的占位符產(chǎn)生沖突,所以如果我們使用maven 的profile 或者其他的來動(dòng)態(tài)替換application.properties 內(nèi)部的屬性,請(qǐng)使用 @name@.

6、YAML文件進(jìn)行多環(huán)境配置

1) 配置文件使用

在application.yml中,你可以使用spring.profiles 來激活你想加載的環(huán)境配置內(nèi)容。

例子:

server:
    address: 192.168.1.100
---
spring:
    profiles: development
server:
    address: 127.0.0.1
---
spring:
    profiles: production & eu-central
server:
    address: 192.168.1.120

在上面的例子中,如果我們激活development 那server.address 就是127.0.0.1。如果production & eu-central 被激活,那server.address 就是192.168.1.120。如果這三個(gè)我都沒激活,那server.address 就是192.168.1.100,環(huán)境配置直接使用---來隔離開。

注意:spring.profiles 這個(gè)屬性可以是一個(gè)名字,也可以是一個(gè)表達(dá)式。

2)@Profile注解使用

我們很多時(shí)候會(huì)遇到組件動(dòng)態(tài)選擇的問題,比如我有多種的權(quán)限接入方式或者數(shù)據(jù)源選擇性激活。但我又不想來來回回寫點(diǎn)if else,那么@Profile就是一個(gè)神器了,他的到來使我們的代碼更加的靈活多變。

比如我們重寫一個(gè)屬于源配置:

//第一個(gè)
@Configuration
@Profile("development")
public class StandaloneDataConfig {

    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.HSQL)
            .addScript("classpath:com/bank/config/sql/schema.sql")
            .addScript("classpath:com/bank/config/sql/test-data.sql")
            .build();
    }
}

//第二個(gè)
@Configuration
@Profile("production")
public class JndiDataConfig {

    @Bean(destroyMethod="")
    public DataSource dataSource() throws Exception {
        Context ctx = new InitialContext();
        return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
    }
}

這樣,我們就可以根據(jù)不同的配置來激活不同的邏輯了,如果再能搭配上遠(yuǎn)程配置中心,那就更美麗了。

7、YAML的問題

1) YAML有很多優(yōu)點(diǎn),那必然也是有一丟丟的小毛病的。那就是YAML文件默認(rèn)不能使用@PropertySource注解來進(jìn)行配置加載。如果你不想進(jìn)行多余的改造,那就老實(shí)的建一個(gè)properties文件用吧。

2)在YAML中配置多環(huán)境配置信息有的時(shí)候會(huì)有奇奇怪怪的問題,比如下面的:

application-dev.yml

server:
  port: 8000
---
spring:
  profiles: "!test"
  security:
    user:
      password: "secret"

如果此時(shí)我啟動(dòng)應(yīng)用的時(shí)候加載了--spring.profiles.active=dev ,那我正常是應(yīng)該得到security.user.password = secret,但真實(shí)的情況卻不是這樣。

因?yàn)槲覀冊(cè)谂渲梦募鲜褂昧藊xx-dev.yml,這時(shí)候當(dāng)應(yīng)用加載的時(shí)候就會(huì)直接找到application-dev.yml文件.而這時(shí)我們配置文件內(nèi)的多環(huán)境配置就失效了。

所以再多環(huán)境配置使用的時(shí)候,我們要不然就選擇xxx-dev.yml、xxx-pro.yml 這種方式,要不然就選擇在一個(gè)文件內(nèi)配置多環(huán)境。二者只能選一個(gè),以免出現(xiàn)惡心人的問題。

8、對(duì)象屬性綁定

有時(shí)候我們會(huì)有一組相同類型的屬性需要加載,如果使用@Value 那真是累死人。這里Spring Boot為我們提供了一個(gè)便捷的方式,我們可以使用一個(gè)類對(duì)所需要的變量進(jìn)行統(tǒng)一的配置加載。

舉個(gè)例子:

//屬性類
package com.example;

import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("acme")
public class AcmeProperties {

    private boolean enabled;

    private InetAddress remoteAddress;

    private final Security security = new Security();

    public boolean isEnabled() { ... }

    public void setEnabled(boolean enabled) { ... }

    public InetAddress getRemoteAddress() { ... }

    public void setRemoteAddress(InetAddress remoteAddress) { ... }

    public Security getSecurity() { ... }

    public static class Security {

        private String username;

        private String password;

        private List<String> roles = new ArrayList<>(Collections.singleton("USER"));

        public String getUsername() { ... }

        public void setUsername(String username) { ... }

        public String getPassword() { ... }

        public void setPassword(String password) { ... }

        public List<String> getRoles() { ... }

        public void setRoles(List<String> roles) { ... }

    }
}

這時(shí)我在application.yml中配置如下屬性,Spring Boot就會(huì)幫助我們直接將屬性綁定到AcmeProperties類中

acme.enabled =false

acme.remote-address=127.0.0.1

acme.security.username=xxx

因?yàn)?@EnableConfigurationProperties只是幫助我們進(jìn)行聲明,在實(shí)際使用上我們需要配合**@Configuration**,比如下面的配置,這樣配置完后我們就可以使用@Resource 進(jìn)行屬性注入了。

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(AcmeProperties.class)
public class MyConfiguration {
}

9、寬松的綁定規(guī)則

上面聊了@ConfigurationProperties 可以幫助我們進(jìn)行對(duì)象屬性綁定,其實(shí)在Spring Boot中為我們提供了相當(dāng)寬松的綁定規(guī)則。

比如context-path綁定到 contextPath屬性,PORT綁定到 port屬性,下面繼續(xù)搞個(gè)Demo。

@ConfigurationProperties(prefix="acme.my-project.person")
public class OwnerProperties {

    private String firstName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

}

以上面的代碼為例,我們能在application.yml中下面的四種配置形式都可以將屬性綁定到 firstName參數(shù)上,厲不厲害。

acme.my-project.person.first-name

acme.myProject.person.firstName

acme.my_project.person.first_name

ACME_MYPROJECT_PERSON_FIRSTNAME

當(dāng)然,為了統(tǒng)一不出問題,建議都使用小寫進(jìn)行屬性聲明如 acme.my-project.person.first-name 。

10、屬性綁定校驗(yàn)

在@ConfigurationProperties 聲明的屬性類上,我們可以增加**@Validated** 來對(duì)配置屬性進(jìn)行校驗(yàn)。

@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {

    @NotNull
    private InetAddress remoteAddress;

    @Valid
    private final Security security = new Security();

    // ... getters and setters

    public static class Security {

        @NotEmpty
        public String username;

        // ... getters and setters

    }

}

“Spring Boot配置方法有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

新聞名稱:SpringBoot配置方法有哪些
網(wǎng)站網(wǎng)址:http://muchs.cn/article10/jdocgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)ChatGPT、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站建設(shè)App開發(fā)、網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)