RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring Boot配置加載相關(guān)知識

科技綠洲 ? 來源:了不起 ? 作者:了不起 ? 2023-10-07 15:47 ? 次閱讀

Spring BOOT 啟動參數(shù)

Java Web的開發(fā)完成后,以前我們都會打包成war文件,然后放大web容器,比如tomcat、jetty這樣的容器。現(xiàn)在基于SpringBoot開發(fā)的項目,我們直接打包成jar文件,基于內(nèi)嵌的tomcat來實現(xiàn)一樣的效果。

而啟動的方式變成了這樣:

java [ options ] -jar *.jar [ arguments ]

常見配置

我們常見的配置有:

  1. --server.port:指定應(yīng)用程序的端口號。
  2. --spring.profiles.active:設(shè)置應(yīng)用程序使用的配置文件中的環(huán)境配置。
  3. --spring.config.additional-location:指定額外的配置文件路徑。
  4. --Xms:設(shè)置JVM初始堆大小。
  5. --Xmx:設(shè)置JVM最大堆大小。
  6. --XX:PermSize:設(shè)置JVM永久代大小。
  7. --XX:MaxPermSize:設(shè)置JVM最大永久代大小。
  8. --Xdebug:開啟遠(yuǎn)程JDWP調(diào)試。
  9. -D:定義屬性。

options

在啟動參數(shù)中,我們可以通過添加這樣的配置,來覆蓋系統(tǒng)屬性中的值:

java -Dfile.encoding=UTF-8 -jar app.jar

在代碼中可以通過這樣獲取該值:

String fileEncoding = System.getProperties("file.encoding"); //UTF-8

在很多項目中,都會基于*System.getProperties()*來控制代碼流程,這里要注意,通過啟動參數(shù)配置的值優(yōu)先級會大于系統(tǒng)中的配置。同時注意改配置出現(xiàn)的位置,在上面使用了options位置來進(jìn)行區(qū)分。

arguments

在SpringBoot項目中,我們一般把配置都會寫在application.yml文件中,隨著項目一并打包到j(luò)ar文件中,在生產(chǎn)環(huán)境中, 啟動項目時通過添加*--spring.config.location=/application.yml*來修改項目的配置文件指向,從而實現(xiàn)覆蓋application的效果。

同樣,我們可以通過配置啟動參數(shù)來覆蓋application中的某個配置項,比如:

java -Dfile.encoding=UTF-8 -jar app.jar --server.port=8080

可以在main方法的參數(shù)中獲取該值

log.info(" >> >> > args: {}", Arrays.toString(args) );

參數(shù)的位置在上面對應(yīng)arguments位置。

優(yōu)先級

系統(tǒng)參數(shù)或環(huán)境變量:

  • 啟動配置
  • set prop=value (export prop=value)
  • 系統(tǒng)中配置的參數(shù)或環(huán)境變量

Spring中的配置:

  • 啟動參數(shù)
  • --spring.config.location=application.yml
  • classpath:application.yml

EnvironmentAware

在Spring中,提供了一個Aware接口 EnvironmentAware ,通過該接口我們可以很方便地獲取上面說的那些參數(shù),不用關(guān)心是系統(tǒng)屬性、環(huán)境變量還是main方法的args。

public class MyService implements ApplicationContextAware, EnvironmentAware {
    
    @Override
    public void setEnvironment(Environment environment) {
        // 可以讀取System properties|env 數(shù)據(jù);系統(tǒng)參數(shù)
        log.info(" >> >> > 從系統(tǒng)屬性中取值: {}", environment.getProperty("file.encoding") );
    }
}

通過觀察SpringBoot啟動流程中,其中在SpringApplication的run方法中,可以看到系統(tǒng)環(huán)境屬性加載過程

ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);

基于StandardEnvironment的擴(kuò)展。

public class StandardEnvironment extends AbstractEnvironment {
    
 public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment";
    
 public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties";
    
 @Override
 protected void customizePropertySources(MutablePropertySources propertySources) {
  propertySources.addLast(
    new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));
  propertySources.addLast(
    new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
 }

}

我們看到的這樣的寫法其實就是基于SpEL對PropertySources的資源的解析:

@Value("#{systemProperties['file.encoding']}")
    private String fileEncoding;

    @Value("#{systemEnvironment['JAVA_HOME']}")
    private String javaHome;

讀取配置順序

  1. 默認(rèn)配置:Spring Boot 默認(rèn)提供了一些基本的配置,如應(yīng)用程序的端口號、上下文路徑等。這些配置位于 SpringBoot jar 包中的默認(rèn)配置文件中。
  2. 用戶自定義配置:如果應(yīng)用程序中有自定義的配置文件,Spring Boot 會首先加載這些文件。用戶可以通過在應(yīng)用程序的 classpath 下放置一個名為 application.properties 或 application.yml 的文件來提供自定義配置。
  3. 命令行參數(shù):在啟動應(yīng)用程序時,可以通過命令行參數(shù)來傳遞配置。這些參數(shù)會被加載并覆蓋默認(rèn)配置和用戶自定義配置。
  4. 環(huán)境變量:環(huán)境變量也可以提供配置信息。如果應(yīng)用程序中定義了環(huán)境變量,它們將被加載并覆蓋默認(rèn)配置、用戶自定義配置和命令行參數(shù)。
  5. 系統(tǒng)屬性:系統(tǒng)屬性也可以提供配置信息。如果應(yīng)用程序中定義了系統(tǒng)屬性,它們將被加載并覆蓋默認(rèn)配置、用戶自定義配置、命令行參數(shù)和環(huán)境變量。

Springboot會先加載PropertiesPropertySourceLoader,后加載YamlPropertySourceLoader,所以先讀取的是properties文件。

結(jié)束語

了解SpringBoot配置加載相關(guān)知識,可以有效解決配置項不生效問題以及需要快速修改配置項的情況。

需要注意的是,在加載多個配置文件時,如果有沖突的配置項,后加載的配置文件中的配置項將覆蓋先加載的配置文件中的相同配置項。因此,在應(yīng)用程序中,應(yīng)該避免使用相同的配置項名來定義不同的配置值。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    565

    瀏覽量

    24727
  • 端口
    +關(guān)注

    關(guān)注

    4

    文章

    963

    瀏覽量

    32051
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    495

    瀏覽量

    22060
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3265

    瀏覽量

    57677
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14338
收藏 人收藏

    評論

    相關(guān)推薦

    啟動Spring Boot項目應(yīng)用的三種方法

    首先大家了解什么是Spring Boot?Spring Boot是由Pivotal團(tuán)隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用
    發(fā)表于 01-14 17:33

    Spring Boot嵌入式Web容器原理是什么

    ,不需要配置任何特殊的XML配置,為了這個目標(biāo),Spring BootSpring 4.0框架之上提供了很多特性,幫助應(yīng)用以“約定優(yōu)于
    發(fā)表于 12-16 07:57

    Spring Boot從零入門1 詳述

    在開始學(xué)習(xí)Spring Boot之前,我之前從未接觸過Spring相關(guān)的項目,Java基礎(chǔ)還是幾年前自學(xué)的,現(xiàn)在估計也忘得差不多了吧,寫Spring
    的頭像 發(fā)表于 12-10 22:18 ?632次閱讀

    Spring認(rèn)證」什么是Spring GraphQL?

    這個項目建立在 Boot 2.x 上,但它應(yīng)該與最新的 Boot2.4.x5 相關(guān)。 要創(chuàng)建項目,請轉(zhuǎn)到start.spring.io并為要使用的GraphQL傳輸選擇啟動器: 啟動機(jī)
    的頭像 發(fā)表于 08-10 14:08 ?813次閱讀
    「<b class='flag-5'>Spring</b>認(rèn)證」什么是<b class='flag-5'>Spring</b> GraphQL?

    Spring認(rèn)證是什么?

    ,例如:配置、組件掃描、AOP、數(shù)據(jù)訪問和事務(wù)、REST、安全、自動配置、執(zhí)行器、 Spring boot測試等。
    的頭像 發(fā)表于 07-04 10:19 ?1315次閱讀
    <b class='flag-5'>Spring</b>認(rèn)證是什么?

    Spring Boot特有的實踐

    Spring Boot是最流行的用于開發(fā)微服務(wù)的Java框架。在本文中,我將與你分享自2016年以來我在專業(yè)開發(fā)中使用Spring Boot所采用的最佳實踐。這些內(nèi)容是基于我的個人經(jīng)驗
    的頭像 發(fā)表于 09-29 10:24 ?901次閱讀

    強(qiáng)大的Spring Boot 3.0要來了

    來源:OSC開源社區(qū)(ID:oschina2013) Spring Boot 3.0 首個 RC 已發(fā)布,此外還為兩個分支發(fā)布了更新:2.7.5 2.6.13。 3.0.0-RC1: https
    的頭像 發(fā)表于 10-31 11:17 ?1856次閱讀

    Spring Boot Web相關(guān)的基礎(chǔ)知識

    上一篇文章我們已經(jīng)學(xué)會了如何通過IDEA快速建立一個Spring Boot項目,還介紹了Spring Boot項目的結(jié)構(gòu),介紹了項目配置文件
    的頭像 發(fā)表于 03-17 15:03 ?649次閱讀

    簡述Spring Boot數(shù)據(jù)校驗

    上一篇文章我們了解了Spring Boot Web相關(guān)知識,初步了解了spring-boot-starter-web,還了解了@Contr
    的頭像 發(fā)表于 03-17 15:07 ?768次閱讀

    Spring Boot配置JSON序列化選項的幾種方法

    看看配置序列化和反序列化選項的最常用方法。 默認(rèn)配置 默認(rèn)情況下,Spring Boot配置將禁用以下
    的頭像 發(fā)表于 10-09 10:26 ?2156次閱讀

    Spring Boot Actuator快速入門

    一下 Spring Boot Actuator ,學(xué)習(xí)如何在 Spring Boot 2.x 中使用、配置和擴(kuò)展這個監(jiān)控工具。
    的頭像 發(fā)表于 10-09 17:11 ?633次閱讀

    Spring Boot啟動 Eureka流程

    在上篇中已經(jīng)說過了 Eureka-Server 本質(zhì)上是一個 web 應(yīng)用的項目,今天就來看看 Spring Boot 是怎么啟動 Eureka 的。 Spring Boot 啟動 E
    的頭像 發(fā)表于 10-10 11:40 ?885次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>啟動 Eureka流程

    Spring Boot的啟動原理

    可能很多初學(xué)者會比較困惑,Spring Boot 是如何做到將應(yīng)用代碼和所有的依賴打包成一個獨立的 Jar 包,因為傳統(tǒng)的 Java 項目打包成 Jar 包之后,需要通過 -classpath 屬性
    的頭像 發(fā)表于 10-13 11:44 ?643次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的啟動原理

    Spring Boot 的設(shè)計目標(biāo)

    Spring 框架復(fù)雜的XML配置。使用 Spring Boot 可以很容易創(chuàng)建一個獨立運行的、基于 Spring 的生產(chǎn)級應(yīng)用程序,而且
    的頭像 發(fā)表于 10-13 14:56 ?580次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設(shè)計目標(biāo)

    Spring事務(wù)傳播性的相關(guān)知識

    本文主要介紹了Spring事務(wù)傳播性的相關(guān)知識
    的頭像 發(fā)表于 01-10 09:29 ?439次閱讀
    <b class='flag-5'>Spring</b>事務(wù)傳播性的<b class='flag-5'>相關(guān)</b><b class='flag-5'>知識</b>
    RM新时代网站-首页