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

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

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

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

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

Spring BOOT 啟動(dòng)參數(shù)

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

而啟動(dòng)的方式變成了這樣:

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

常見配置

我們常見的配置有:

  1. --server.port:指定應(yīng)用程序的端口號(hào)。
  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

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

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

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

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

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

arguments

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

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

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)先級(jí)

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

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

Spring中的配置:

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

EnvironmentAware

在Spring中,提供了一個(gè)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啟動(dòng)流程中,其中在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()));
 }

}

我們看到的這樣的寫法其實(shí)就是基于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)用程序的端口號(hào)、上下文路徑等。這些配置位于 SpringBoot jar 包中的默認(rèn)配置文件中。
  2. 用戶自定義配置:如果應(yīng)用程序中有自定義的配置文件,Spring Boot 會(huì)首先加載這些文件。用戶可以通過在應(yīng)用程序的 classpath 下放置一個(gè)名為 application.properties 或 application.yml 的文件來提供自定義配置。
  3. 命令行參數(shù):在啟動(dòng)應(yīng)用程序時(shí),可以通過命令行參數(shù)來傳遞配置。這些參數(shù)會(huì)被加載并覆蓋默認(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會(huì)先加載PropertiesPropertySourceLoader,后加載YamlPropertySourceLoader,所以先讀取的是properties文件。

結(jié)束語

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

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

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

    關(guān)注

    1

    文章

    566

    瀏覽量

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

    關(guān)注

    4

    文章

    964

    瀏覽量

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

    關(guān)注

    0

    文章

    495

    瀏覽量

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

    關(guān)注

    37

    文章

    3268

    瀏覽量

    57699
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14341
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

    ,不需要配置任何特殊的XML配置,為了這個(gè)目標(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)的項(xiàng)目,Java基礎(chǔ)還是幾年前自學(xué)的,現(xiàn)在估計(jì)也忘得差不多了吧,寫Spring
    的頭像 發(fā)表于 12-10 22:18 ?637次閱讀

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

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

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

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

    Spring Boot特有的實(shí)踐

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

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

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

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

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

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

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

    Spring Boot時(shí)配置JSON序列化選項(xiàng)的幾種方法

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

    Spring Boot Actuator快速入門

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

    Spring Boot啟動(dòng) Eureka流程

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

    Spring Boot的啟動(dòng)原理

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

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

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

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

    本文主要介紹了Spring事務(wù)傳播性的相關(guān)知識(shí)。
    的頭像 發(fā)表于 01-10 09:29 ?446次閱讀
    <b class='flag-5'>Spring</b>事務(wù)傳播性的<b class='flag-5'>相關(guān)</b><b class='flag-5'>知識(shí)</b>