該篇為Sping Boot入門到實戰系列入門篇的第三篇。介紹Spring Boot的屬性配置。
傳統的Spring Web應用自定義屬性一般是通過添加一個demo.properties配置文件(文件名自定義),然后在xml配置中通過
<util:properties id="demoProps" location="classpath:demo.properties" />
引入屬性文件。再定義一個Bean來讀取這些屬性,Bean配置:
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="包名.DemoUtil.init" /> <property name="arguments"> <list> <ref bean="demoProps" /> </list> </property> </bean>
Bean定義:
public class DemoUtil { private static Properties properties; static void init(Properties props) { properties = props; } public static String getValue(String key){ return properties.getProperty(key); } }
在其它地方通過DemoUtil.getValue()方法來訪問具體某個屬性的值。
Spring Boot中,可以在多個地方配置屬性,包括properties文件,yaml文件,環境變量, 系統屬性,命令行參數等, 這些屬性都會被Spring Boot加到Environment中,可通過
@Value注解,
Environment 實例,或
@ConfigurationProperties注解的類來訪問。
屬性加載優先級順序:
- 如果有使用devtools,devtools 全局設置的屬性(用戶目錄 ~/.spring-bootdevtools.properties)
- 測試類的注解@TestPropertySource
- 測試類屬性注解 @SpringBootTest#properties
- 命令行參數
- SPRING_APPLICATION_JSON里的屬性(環境變量或系統屬性)
- ServletConfig初始化參數
- ServletContext初始化參數
- JNDI參數 java:comp/env
- Java系統屬性 System.getProperties()
- 操作系統環境變量
- RandomValuePropertySource 配置的屬性 random.*
- jar包外部的applictaion-{profile}.properties,applictaion-{profile}.yml配置文件
- jar包內部的applictaion-{profile}.properties,applictaion-{profile}.yml配置文件
- jar包外部的applictaion.properties,applictaion.yml配置文件
- jar包內部的applictaion.properties,applictaion.yml配置文件
- @Configuration類上的 @PropertySource注解指定的配置文件
- 默認屬性: SpringApplication.setDefaultProperties
上述屬性配置,除了紅色標注的外,其它一般應用較少。序號低的配置優先級高於序號高的配置,即如果存在相同屬性配置 ,則序號低的配置會覆蓋序號高的配置。
配置屬性
1. 命令行參數
啟動Spring Boot應用時,可以指定命令行參數,如:
java -jar springboot-demo-properties.jar --my.name=command_line_devlink
該參數值將會覆蓋應用其它地方的同名屬性配置值。命令行參數放在xx.jar 的后面。
可以通過SpringApplication.setAddCommandLineProperties(false) 禁用命令行參數配置
2. Java系統屬性
同樣在啟動Spring Boot應用時,可以指定Java系統屬性,如:
java -Dmy.name=system_properties_devlink -jar springboot-demo-properties.jar
Java系統屬性放在java命令之后。
3. 操作系統環境變量
配置過JAVA_HOME的應該理解何為環境變量。某些操作系統可能不支持.分隔的屬性名,可以改為以下划線連接。Spring Boot將myName, my.name, MY_NAME視為等效。
4. 應用屬性配置文件(.properties文件或 .yml文件)
.properties文件屬性配置格式:
my.name=devlink my.list[0]=aaa //配置列表 my.list[1]=bbb
.yml文件屬性配置格式:
my: name: devlink list: //配置列表 - aaa - bbb
yml中,屬性名與值之間冒號后面必須有空格。
應用屬性配置文件位置:
- jar包所在當前目錄下的子目錄/config
- jar包所在當前目錄
- classpath根目錄下的子目錄/config
- classpath根目錄
序號低的優先級高於序號高的優先級,即jar包外的配置優先級高於jar包內的配置。同一目錄下,.properties文件的優先級高於.yml文件。application-{profile}.properties的優先級高於application.properties。
訪問屬性
1. 類中屬性上添加 @Value("${xx}") 注解方式。如:
@Value("${my.name}") private String myName;
可以指定默認值,如 @Value("${my.gender:f}"), 當my.gender未配置時,默認使用值"f"
2. 通過@ConfigurationProperties注解的類來訪問。如定義:
@Configuration @ConfigurationProperties(prefix = "my") public class MyConfig { private String name; getter/setter; }
然后在需要訪問的Bean中,通過@Autowired 注入MyConfig實例,通過getName()方法即可訪問my.name屬性值。
3. 通過Environment 實例訪問。如:
@Autowired private Environment env;
然后調用env.getProperty("my.name")訪問。