日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

springboot 获取application参数_LOOK ! SpringBoot的外部化配置最全解析

發(fā)布時間:2023/12/15 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot 获取application参数_LOOK ! SpringBoot的外部化配置最全解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本篇要點

  • 介紹各種配置方式的優(yōu)先級。
  • 介紹各種外部化配置方式。
  • 介紹yaml的格式及原理。
  • 介紹如何綁定并測試類型安全的屬性配置。
  • 介紹@ConfigurationProperties與@Value的區(qū)別。

一、SpringBoot官方文檔對于外部化配置的介紹及作用順序

SpringBoot支持多種外部化配置,以便于開發(fā)者能夠在不同的環(huán)境下,使用同一套應(yīng)用程序代碼。外部化配置的方式有多種:properties文件,yaml文件,Environment變量已經(jīng)命令行參數(shù)等等。

外部化配置的屬性值可以通過@Value注解自動注入,亦可以通過Spring的Environment抽象訪問,也可以通過@ConfigurationProperties注解綁定到結(jié)構(gòu)化對象上。

SpringBoot支持很多種的外部化配置,待會我們會介紹到。在這之前,我們必須要知道如果多種配置同時出現(xiàn),一定是按照特定的順序生效的。規(guī)則如下:

  • devtool處于active狀態(tài)時, $HOME/.config/spring-boot 目錄中的Devtool全局配置。
  • 測試中的@TestPropertySource注解。
  • 測試中的@SpringBootTest#properties注解特性。
  • 命令行參數(shù)。
  • SPRING_APPLICATION_JSON 中的屬性(環(huán)境變量或系統(tǒng)屬性中的內(nèi)聯(lián)JSON嵌入)。
  • ServletConfig 初始化參數(shù)。
  • ServletContext 初始化參數(shù)。
  • java:comp/env 里的JNDI屬性
  • JVM系統(tǒng)屬性 System.getProperties() 。
  • 操作系統(tǒng)環(huán)境變量
  • 僅具有 random.* 屬性的 RandomValuePropertySource 。
  • 應(yīng)用程序以外的application-{profile}.properties或者application-{profile}.yml文件
  • 打包在應(yīng)用程序內(nèi)的application-{profile}.properties或者application-{profile}.yml文件
  • 應(yīng)用程序以外的application.properties或者appliaction.yml文件
  • 打包在應(yīng)用程序內(nèi)的application.properties或者appliaction.yml文件
  • @Configuration類上的@PropertySource注解,需要注意,在ApplicationContext刷新之前,是不會將這個類中的屬性加到環(huán)境中的,像 logging.*,spring.main.* 之類的屬性,在這里配置為時已晚。
  • 默認(rèn)屬性(通過 SpringApplication.setDefaultProperties 指定).
  • 這里列表按組優(yōu)先級排序,也就是說, 任何在高優(yōu)先級屬性源里設(shè)置的屬性都會覆蓋低優(yōu)先級的相同屬性 ,列如我們上面提到的命令行屬性就覆蓋了application.properties的屬性。

    舉個例子吧:

    如果在application.properties中設(shè)置 name=天喬巴夏 ,此時我用命令行設(shè)置 java -jar hyh.jar --author.name=summerday ,最終的name值將會是summerday,因為命令行屬性優(yōu)先級更高。

    二、各種外部化配置舉例

    1、隨機值配置

    配置文件中 ${random} 可以用來生成各種不同類型的隨機值,從而簡化了代碼生成的麻煩,例如 生成 int 值、long 值或者 string 字符串。原理在于, RandomValuePropertySource 類重寫了 getProperty 方法,判斷以 random. 為前綴之后,進行了適當(dāng)?shù)奶幚怼?/p>my.secret=${random.value}my.number=${random.int}my.bignumber=${random.long}my.uuid=${random.uuid}my.lessThanTen=${random.int(10)}my.inRange=${random.int[1024,65536]}

    2、命令行參數(shù)配置

    默認(rèn)情況下,SpringApplication將所有的命令行選項參數(shù)【以 -- 開頭的參數(shù),如 --server.port=9000 】轉(zhuǎn)換為屬性,并將它們加入SpringEnvironment中,命令行屬性的配置始終優(yōu)先于其他的屬性配置。

    如果你不希望將命令行屬性添加到Environment中,可以使用 SpringApplication.setAddCommandLineProperties(false) 禁用它。

    $ java -jar app.jar --debug=true #開啟debug模式,這個在application.properties文件中定義debug=true是一樣的

    3、屬性文件配置

    屬性文件配置這一部分是我們比較熟悉的了,我們在快速創(chuàng)建SpringBoot項目的時候,默認(rèn)會在resources目錄下生成一個application.properties文件。SpringApplication都會從配置文件加載配置的屬性,并最終加入到Spring的Environment中。除了resources目錄下,還有其他路徑,SpringBoot默認(rèn)是支持存放配置文件的。

    /config/config

    以上四個,優(yōu)先級從上往下依次降低,也就是說,如果同時出現(xiàn),上面配置的屬性將會覆蓋下面的。

    關(guān)于配置文件,properties和yaml文件都能夠滿足配置的需求。

    當(dāng)然,這些配置都是靈活的,如果你不喜歡默認(rèn)的配置文件命名或者默認(rèn)的路徑,你都可以進行配置:

    $ java -jar myproject.jar --spring.config.name=myproject$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

    4、指定profile屬性

    通常情況下,我們開發(fā)的應(yīng)用程序需要部署到不同的環(huán)境下,屬性的配置自然也需要不同。如果每次在發(fā)布的時候替換配置文件,過于麻煩。SpringBoot的多環(huán)境配置為此提供了便利。具體做法如下:

    我們之前在介紹各種配置的優(yōu)先級的時候說過, application-{profile}.properties或者application-{profile}.yml文件 的優(yōu)先級高于 application.properties或application.yml 配置,這里的profile就是我們定義的環(huán)境標(biāo)識:

    我們在resource目錄下創(chuàng)建三個文件:

    • application.properties:默認(rèn)的配置,default。
    • application-dev.properties:開發(fā)環(huán)境,dev。
    • application-prod.properties:生產(chǎn)環(huán)境,prod。

    我們可以通過指定 spring.profiles.active 屬性來激活對應(yīng)的配置環(huán)境:

    spring.profiles.active=dev

    或使用命令行參數(shù)的配置形式:

    $ java -jar hyh.jar --spring.profiles.active=dev

    如果沒有profile指定的文件于profile指定的文件的配置屬性同時定義,那么指定profile的配置優(yōu)先。

    5、使用占位符

    在使用application.properties中的值的時候,他們會從Environment中獲取值,那就意味著,可以引用之前定義過的值,比如引用系統(tǒng)屬性。具體做法如下:

    name=天喬巴夏description=${name} is my name

    6、加密屬性

    Spring Boot不提供對加密屬性值的任何內(nèi)置支持,但是,它提供了 修改Spring環(huán)境中的值 所必需的掛鉤點。我們可以通過實現(xiàn)EnvironmentPostProcessor接口在應(yīng)用程序啟動之前操縱Environment。

    可以參考 howto.html ,查看具體使用方法。

    7、使用YAML代替properties

    YAML是JSON的超集,是一種 指定層次結(jié)構(gòu)配置數(shù)據(jù)的便捷格式 ,我們以properties文件對比一下就知道了:

    #propertiesspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=123456my.servers[0]=www.hyh.commy.servers[1]=www.yhy.com# ymlspring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8 username: root password: 123456my: server: - www.hyh.com - www.yhy.com

    只要在類路徑上具有SnakeYAML庫,SpringApplication類就會自動支持YAML作為屬性配置的方式。SpringBoot項目中的 spring-boot-starter 已經(jīng)提供了相關(guān)類庫: org.yaml.snakeyaml,因此SpringBoot天然支持這種方式配置。

    關(guān)于yaml文件的格式,可以參考官方文檔: Using YAML Instead of Properties

    8、類型安全的屬性配置

    上面說到通過 @Value("${property}") 注解來注入配置有時會比較麻煩,特別是當(dāng)多個屬性本質(zhì)上具有層次結(jié)構(gòu)的時候。SpringBoot提供了一種解決方案: 讓強類型的bean管理和驗證你的配置

    直接來看具體的使用叭:

    @ConfigurationPropertie定義一個綁定配置的JavaBean

  • 使用默認(rèn)構(gòu)造器+getter和setter注入
  • @ConfigurationProperties("acme")public class AcmeProperties { private boolean enabled; //acme.enabled 默認(rèn)為false private InetAddress remoteAddress;// acme.remote-address 可以從String轉(zhuǎn)換而來的類型 private final Security security = new Security();//.. 省略getter和setter方法 public static class Security { private String username; // acme.security.username private String password; // acme.security.password private List roles = new ArrayList<>(Collections.singleton("USER"));// acme.security.roles//.. 省略getter setter方法 }}

    這種方式依賴于默認(rèn)的空構(gòu)造函數(shù),通過getter和setter方法賦值,因此getter和setter方法是必要的,且不支持靜態(tài)屬性的綁定。

    如果嵌套pojo屬性已經(jīng)被初始化值: private final Security security = new Security(); 可以不需要setter方法。如果希望綁定器使用其默認(rèn)構(gòu)造函數(shù)動態(tài)創(chuàng)建實例,則需要setter。

  • 通過@ContructorBinding注解使用構(gòu)造器綁定的方式:
  • @ConstructorBinding //標(biāo)注使用構(gòu)造器綁定@ConfigurationProperties("acme")public class AcmeProperties { private final Security security; private final boolean enabled; private final InetAddress remoteAddress; public AcmeProperties(boolean enabled, InetAddress remoteAddress, Security security) { this.enabled = enabled; this.remoteAddress = remoteAddress; this.security = security; } //..省略getter方法 @ToString public static class Security { private final String username; private final String password; private final List roles; public Security(String username, String password, @DefaultValue("USER") List roles) { this.username = username; this.password = password; this.roles = roles; } } //..省略getter方法}

    如果沒有配置Security實例屬性,那么最后結(jié)果:Security=null。如果我們想讓Security={username=null,password=null,roles=[USER]},可以在Security上加上@DefaultValue。 public AcmeProperties(boolean enabled, InetAddress remoteAddress, @DefaultValue Security security)

    通過@EnableConfigurationProperties注冊

    已經(jīng)定義好了JavaBean,并與配置屬性綁定完成,接著需要注冊這些bean。我們通常用的@Component或@Bean,@Import加載bean的方式在這里是不可取的,SpringBoot提供了解決方案: 使用@EnableConfigurationProperties ,我們既可以一一指定配置的類,也可以按照組件掃描的方式進行配置。

    @SpringBootApplication@EnableConfigurationProperties({HyhConfigurationProperties.class, MyProperties.class,AcmeProperties.class})public class SpringBootProfileApplication {}@SpringBootApplication@ConfigurationPropertiesScan({"com.hyh.config"})public class SpringBootProfileApplication {}

    配置yaml文件

    acme: remote-address: 192.168.1.1 security: username: admin roles: - USER - ADMIN

    注入properties,測試

    @Configurationpublic class Application implements CommandLineRunner { @Autowired private AcmeProperties acmeProperties; @Override public void run(String... args) throws Exception { System.out.println(acmeProperties); }}//輸出: AcmeProperties(security=AcmeProperties.Security(username=admin, password=null, roles=[USER, ADMIN]), enabled=false, remoteAddress=/192.168.1.1)

    寬松綁定

    SpringBoot采用寬松的規(guī)則進行Environment和@ConfigurationProperties標(biāo)注bean的匹配。如:

    @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; }}

    下面表格中的屬性名都可以匹配:

    @ConfigurationProperties注解中的prefix值必須是kebab case形式的,以 - 為分割符。

    Spring官方建議,屬性盡可能以lower-case kebab的形式:my.property-name=acme

    Map如何綁定

    綁定到Map屬性時,如果key包含 小寫字母數(shù)字字符或-以外的任何其他字符 ,則需要使用方括號包圍key,以便保留原始值。 如果鍵沒有被 [] 包圍,則所有非字母數(shù)字或-的字符都將被刪除。如下:

    hyh: username: 天喬巴夏 password: 123456 map: "[/key1]": value1 #用引號包圍[],用[]包圍key /key3: value3 key-4: value4 key/5: value5# 結(jié)果:"map":{/key1=value1,key5=value5, key-4=value4, key3=value3}

    環(huán)境變量如何綁定

    遵循三條原則:

  • 把 . 換成下劃線 _ 。
  • 移除 - 。
  • 小寫轉(zhuǎn)大寫。
  • 如: spring.main.log-startup-info 轉(zhuǎn)為: SPRING_MAIN_LOGSTARTUPINFO , my.acme[0].other 轉(zhuǎn)為 MY_ACME_0_OTHER 。

    9、復(fù)雜類型

    之前介紹yml文件,介紹了單純的數(shù)組形式或值的綁定,SpringBoot還支持復(fù)雜類型的綁定。

    merge: list: - name: 天喬巴夏 desc: 帥啊 - name: tqbx desc: 很帥啊 map: key1: name: summerday desc: handsome! key2: name: summer@ToString@ConfigurationProperties(prefix = "merge")public class MergeProperties { private final List list = new ArrayList<>(); private final Map map = new HashMap<>(); public List getList() { return list; } public Map getMap() { return map; }}

    最后輸出:

    MergeProperties( list=[User(name=天喬巴夏, desc=帥啊), User(name=tqbx, desc=很帥啊)], map={key1=User(name=summerday, desc=handsome!), key2=User(name=summer, desc=null)}a)

    10、參數(shù)校驗

    對@ConfigurationProperties類使用Spring的 @Valid 注解時,Spring Boot就會嘗試對其進行驗證。

    你可以直接在配置類上使用JSR-303 javax.validation 約束注解。這個做法的前提是,你的類路徑上有兼容的JSR-303實現(xiàn):

    org.hibernate hibernate-validator 6.0.18.Final

    然后將約束注解加到字段上,如下:

    @Data@Validated@ConfigurationProperties(prefix = "validate")public class ValidateProperties { @NotNull private String name; @Valid private final SubProperties subProperties = new SubProperties(); @Data public static class SubProperties { @Min(value = 10,message = "年齡最小為10") public Integer age; }}

    配置如下:

    validate: name: hyh sub-properties: age: 5

    結(jié)果如下:

    Description:Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'validate' to com.hyh.config.ValidateProperties failed: Property: validate.sub-properties.age Value: 5 Origin: class path resource [application.yml]:47:10 Reason: 年齡最小為10 Action:Update your application's configuration

    三、@ConfigurationProperties與@Value的區(qū)別

    @Value注解是一個核心容器功能,它沒有提供和type-safe配置屬性相關(guān)的功能,下面這個表格總結(jié)了兩者分別支持的功能:

    官方建議:

    • 如果你為自己的組件定義了一套配置,建議使用@ConfigurationProperties和POJO綁定,這樣做能夠提供結(jié)構(gòu)化且類型安全的對象。
    • 如果硬要使用@Value,建議使用kebab-case形式,如@Value(" ${demo.item-price}")

    來源:https://www.tuicool.com/articles/uQFFBzz

    總結(jié)

    以上是生活随笔為你收集整理的springboot 获取application参数_LOOK ! SpringBoot的外部化配置最全解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。