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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

springboot 获取application参数_(最新 9000 字 )Spring Boot 配置特性解析

發布時間:2025/3/20 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot 获取application参数_(最新 9000 字 )Spring Boot 配置特性解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概述

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

二、新版的外部配置

1、基礎配置加載

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

使用配置有兩種方式:

  • 使用注解@Value,來注入Environment 里面包含的屬性
  • 使用@ConfigurationProperties 來定義一個屬性類,來包含我們需要的屬性(這些屬性都可以配置在YAML中)

Spring Boot 外部配置這么多,那如果都配置了哪個會生效呢?

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

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

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

3)考試中 使用了@SpringBootTest的 properties

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

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

  • 在系統環境變量加載 SPRING_APPLICATION_JSON='{"persion":{"name":"xxx"}}',這種加載會將這個數據加到Spring Environment中,我們可以獲得一個persion.name 的屬性,值為xxx
  • 使用System屬性加載 java -Dspring.application.json='{"persion":{"name":"xxx"}}' -jar app.jar,這種加載方式會將spring.application.json屬性的值當做一個String來加載,不會解析。

6)ServletConfig 初始化的配置

7)ServletContext初始化的配置

8)java:comp/env的JNDI特性

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

10)操作系統配置的環境變量

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

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

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

14)應用外部配置的application.properties或 YAML

15)應用內部配置的application-{profile}.properties 或 YAML。

這里14、和15 的 SpringApplication 會從application.properties來進行配置屬性的加載。

這個配置會從四個位置按照優先級從高到低的方式覆蓋加載,高優先級覆蓋低優先級的,來看下:

  • 應用外部當前目錄里 /config 文件夾下的 application.properties 或者application.yml
  • 應用外部當前目錄里的 application.properties 或者application.yml
  • 應用內部classpath下的/config ,也就是resources/config 目錄下的 application.properties 或者application.yml
  • 應用內部classpath下,也就是resources 目錄下的application.properties 或者application.yml

16)@Configuration 配置類上配置了 @PropertySource注解的,但在spring 上下文刷新前這個配置是不會被加載到Environment里面的。這種加載方式不能配置那些應用上下文刷新前就需要加載的屬性,比如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 設置的參數

下面來用一個Demo 說下:

import org.springframework.stereotype.*;import org.springframework.beans.factory.annotation.*;@Componentpublic class MyBean { @Value("${name}") private String name; // ...}
  • 你可以使用 classpath 下的application.yml來配置name= laowang
  • 可以使用一個外部的application.yml 來設置一個name = laoli 覆蓋上一個配置 (當前name 獲取的話是laoli)
  • 在可以使用java -jar app.jar --name="Spring" 再來覆蓋上一個配置 (當前name獲取的話是 Spring)

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

2、配置隨機屬性

隨機屬性的注入其實是通過RandomValuePropertySource 來實現的,它可以幫我們來產生integers、 longs、 uuid、strings 的隨機值。這個對于我們平時進行一些測試案例還是很實用的。

//可以配置在application.ymlmy.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的方式將命令行參數server.port 添加到我們應用的Environment,可以使用@Value等方式獲取。正常情況下命令行添加的屬性優先級是咱們優先級高的。

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

其實使用命令行加載最多的可能就是--javaagent 這個屬性了,對于現在的公司,APM監控那是必不可少的。我們也可以通過命令參數的配置來臨時的加載一些屬性進行測試使用。

4、應用加載配置文件

其實上面已經說過了,這里再重新提一下。SpringApplication 會從application.yml里面加載屬性配置,并將他們添加到Spring 的Environment中供我們使用。優先級如下,高優先級覆蓋低的(這里放個原版,可以自己嘗試理解下):

  • A /config subdirectory of the current directory
  • The current directory
  • A classpath /config package
  • The classpath root
  • 如果你不喜歡配置文件叫做application.properties,也可以使用spring.config.name來進行配置。也可以使用spring.config.location 來指定配置加載路徑。

    舉例說明:

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

    因為spring.config.name 和 spring.config.location 配置是用來確定應用需要加載哪些屬性的,所以需要盡可能早的加載。一般都是使用系統環境變量、系統參數、命令行加載的方式進行使用。

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

  • file:./config/
  • file:./config/*/
  • file:./
  • classpath:/config/
  • classpath:/
  • 5、占位符的使用

    在application.properties 我們可以使用占位符來進行屬性的動態加載

    比如我們可以借助maven 的profile 在打包的時候動態的對環境參數進行替換(比如替換mysql 、redis等域名)

    上幾個例子:

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

    注意一點:

    如果你的POM 里面集成了spring-boot-starter-parent ,那么默認的maven-resources-plugins插件會使用@maven.token@來代替${maven.token}。這么做其實是為了防止和Spring的占位符產生沖突,所以如果我們使用maven 的profile 或者其他的來動態替換application.properties 內部的屬性,請使用 @name@.

    6、YAML文件進行多環境配置

    1) 配置文件使用

    在application.yml中,你可以使用spring.profiles 來激活你想加載的環境配置內容。

    例子:

    server: address: 192.168.1.100---spring: profiles: developmentserver: address: 127.0.0.1---spring: profiles: production & eu-centralserver: address: 192.168.1.120

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

    注意:spring.profiles 這個屬性可以是一個名字,也可以是一個表達式。

    2)@Profile注解使用

    我們很多時候會遇到組件動態選擇的問題,比如我有多種的權限接入方式或者數據源選擇性激活。但我又不想來來回回寫點if else,那么@Profile就是一個神器了,他的到來使我們的代碼更加的靈活多變。

    比如我們重寫一個屬于源配置:

    //第一個@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(); }}//第二個@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"); }}

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

    7、YAML的問題

    1) YAML有很多優點,那必然也是有一丟丟的小毛病的。那就是YAML文件默認不能使用@PropertySource注解來進行配置加載。如果你不想進行多余的改造,那就老實的建一個properties文件用吧。

    2)在YAML中配置多環境配置信息有的時候會有奇奇怪怪的問題,比如下面的:

    application-dev.yml

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

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

    因為我們在配置文件名上使用了xxx-dev.yml,這時候當應用加載的時候就會直接找到application-dev.yml文件.而這時我們配置文件內的多環境配置就失效了。

    所以在多環境配置使用的時候,我們要不然就選擇xxx-dev.yml、xxx-pro.yml 這種方式,要不然就選擇在一個文件內配置多環境。二者只能選一個,以免出現惡心人的問題。

    8、對象屬性綁定

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

    舉個例子:

    //屬性類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 roles = new ArrayList<>(Collections.singleton("USER")); public String getUsername() { ... } public void setUsername(String username) { ... } public String getPassword() { ... } public void setPassword(String password) { ... } public List getRoles() { ... } public void setRoles(List roles) { ... } }}

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

    acme.enabled =falseacme.remote-address=127.0.0.1acme.security.username=xxx

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

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

    9、寬松的綁定規則

    上面聊了@ConfigurationProperties 可以幫助我們進行對象屬性綁定,其實在Spring Boot中為我們提供了相當寬松的綁定規則。

    比如context-path綁定到 contextPath屬性,PORT綁定到 port屬性,下面繼續搞個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參數上,厲不厲害。

    acme.my-project.person.first-name

    acme.myProject.person.firstName

    acme.my_project.person.first_name

    ACME_MYPROJECT_PERSON_FIRSTNAME

    當然,為了統一不出問題,建議都使用小寫進行屬性聲明如 acme.my-project.person.first-name 。

    10、屬性綁定校驗

    在@ConfigurationProperties 聲明的屬性類上,我們可以增加**@Validated** 來對配置屬性進行校驗。

    @ConfigurationProperties(prefix="acme")@Validatedpublic 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 }}

    原文鏈接:https://my.oschina.net/u/560490/blog/4646089?_from=gitee_search

    如果覺得本文對你有幫助,可以關注支持一下一起學習進步

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的springboot 获取application参数_(最新 9000 字 )Spring Boot 配置特性解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。