Spring BOOT 啟動參數(shù)
在Java Web的開發(fā)完成后,以前我們都會打包成war文件,然后放大web容器,比如tomcat、jetty這樣的容器。現(xiàn)在基于SpringBoot開發(fā)的項(xiàng)目,我們直接打包成jar文件,基于內(nèi)嵌的tomcat來實(shí)現(xiàn)一樣的效果。
而啟動的方式變成了這樣:
java [ options ] -jar *.jar [ arguments ]
常見配置
我們常見的配置有:
- --server.port:指定應(yīng)用程序的端口號。
- --spring.profiles.active:設(shè)置應(yīng)用程序使用的配置文件中的環(huán)境配置。
- --spring.config.additional-location:指定額外的配置文件路徑。
- --Xms:設(shè)置JVM初始堆大小。
- --Xmx:設(shè)置JVM最大堆大小。
- --XX:PermSize:設(shè)置JVM永久代大小。
- --XX:MaxPermSize:設(shè)置JVM最大永久代大小。
- --Xdebug:開啟遠(yuǎn)程JDWP調(diào)試。
- -D:定義屬性。
options
在啟動參數(shù)中,我們可以通過添加這樣的配置,來覆蓋系統(tǒng)屬性中的值:
java -Dfile.encoding=UTF-8 -jar app.jar
在代碼中可以通過這樣獲取該值:
String fileEncoding = System.getProperties("file.encoding"); //UTF-8
在很多項(xiàng)目中,都會基于*System.getProperties()*來控制代碼流程,這里要注意,通過啟動參數(shù)配置的值優(yōu)先級會大于系統(tǒng)中的配置。同時(shí)注意改配置出現(xiàn)的位置,在上面使用了options位置來進(jìn)行區(qū)分。
arguments
在SpringBoot項(xiàng)目中,我們一般把配置都會寫在application.yml文件中,隨著項(xiàng)目一并打包到j(luò)ar文件中,在生產(chǎn)環(huán)境中, 啟動項(xiàng)目時(shí)通過添加*--spring.config.location=/application.yml*來修改項(xiàng)目的配置文件指向,從而實(shí)現(xiàn)覆蓋application的效果。
同樣,我們可以通過配置啟動參數(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)先級
系統(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中,提供了一個(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啟動流程中,其中在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;
讀取配置順序
- 默認(rèn)配置:Spring Boot 默認(rèn)提供了一些基本的配置,如應(yīng)用程序的端口號、上下文路徑等。這些配置位于 SpringBoot jar 包中的默認(rèn)配置文件中。
- 用戶自定義配置:如果應(yīng)用程序中有自定義的配置文件,Spring Boot 會首先加載這些文件。用戶可以通過在應(yīng)用程序的 classpath 下放置一個(gè)名為 application.properties 或 application.yml 的文件來提供自定義配置。
- 命令行參數(shù):在啟動應(yīng)用程序時(shí),可以通過命令行參數(shù)來傳遞配置。這些參數(shù)會被加載并覆蓋默認(rèn)配置和用戶自定義配置。
- 環(huán)境變量:環(huán)境變量也可以提供配置信息。如果應(yīng)用程序中定義了環(huán)境變量,它們將被加載并覆蓋默認(rèn)配置、用戶自定義配置和命令行參數(shù)。
- 系統(tǒng)屬性:系統(tǒng)屬性也可以提供配置信息。如果應(yīng)用程序中定義了系統(tǒng)屬性,它們將被加載并覆蓋默認(rèn)配置、用戶自定義配置、命令行參數(shù)和環(huán)境變量。
Springboot會先加載PropertiesPropertySourceLoader,后加載YamlPropertySourceLoader,所以先讀取的是properties文件。
結(jié)束語
了解SpringBoot配置加載相關(guān)知識,可以有效解決配置項(xiàng)不生效問題以及需要快速修改配置項(xiàng)的情況。
需要注意的是,在加載多個(gè)配置文件時(shí),如果有沖突的配置項(xiàng),后加載的配置文件中的配置項(xiàng)將覆蓋先加載的配置文件中的相同配置項(xiàng)。因此,在應(yīng)用程序中,應(yīng)該避免使用相同的配置項(xiàng)名來定義不同的配置值。
-
文件
+關(guān)注
關(guān)注
1文章
597瀏覽量
26110 -
端口
+關(guān)注
關(guān)注
4文章
1107瀏覽量
34037 -
容器
+關(guān)注
關(guān)注
0文章
535瀏覽量
23023 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3346瀏覽量
60405 -
spring
+關(guān)注
關(guān)注
0文章
341瀏覽量
16042
發(fā)布評論請先 登錄
啟動Spring Boot項(xiàng)目應(yīng)用的三種方法
Spring Boot嵌入式Web容器原理是什么
Spring Boot從零入門1 詳述
「Spring認(rèn)證」什么是Spring GraphQL?
Spring Boot特有的實(shí)踐
強(qiáng)大的Spring Boot 3.0要來了
Spring Boot Web相關(guān)的基礎(chǔ)知識
簡述Spring Boot數(shù)據(jù)校驗(yàn)
Spring Boot時(shí)配置JSON序列化選項(xiàng)的幾種方法
Spring Boot Actuator快速入門
Spring Boot啟動 Eureka流程
Spring Boot的啟動原理
Spring Boot 的設(shè)計(jì)目標(biāo)
Spring Boot配置加載相關(guān)知識
評論