1. 程式人生 > >Sping Boot入門到實戰之入門篇(三):Spring Boot屬性配置

Sping Boot入門到實戰之入門篇(三):Spring Boot屬性配置

git 測試 add 禁用 rop fix ron org set

  該篇為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註解的類來訪問。   屬性加載優先級順序:
  1. 如果有使用devtools,devtools 全局設置的屬性(用戶目錄 ~/.spring-bootdevtools.properties)
  2. 測試類的註解@TestPropertySource
  3. 測試類屬性註解 @SpringBootTest#properties
  4. 命令行參數
  5. SPRING_APPLICATION_JSON裏的屬性(環境變量或系統屬性)
  6. ServletConfig初始化參數
  7. ServletContext初始化參數
  8. JNDI參數 java:comp/env
  9. Java系統屬性 System.getProperties()
  10. 操作系統環境變量
  11. RandomValuePropertySource 配置的屬性 random.*
  12. jar包外部的applictaion-{profile}.properties,applictaion-{profile}.yml配置文件
  13. jar包內部的applictaion-{profile}.properties,applictaion-{profile}.yml配置文件
  14. jar包外部的applictaion.properties,applictaion.yml配置文件
  15. jar包內部的applictaion.properties,applictaion.yml配置文件
  16. @Configuration類上的 @PropertySource註解指定的配置文件
  17. 默認屬性: 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中,屬性名與值之間冒號後面必須有空格。

  應用屬性配置文件位置:
  1. jar包所在當前目錄下的子目錄/config
  2. jar包所在當前目錄
  3. classpath根目錄下的子目錄/config
  4. 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")訪問。

  本篇源碼:https://github.com/ronwxy/springboot-learning/tree/master/springboot-demo-properties

Sping Boot入門到實戰之入門篇(三):Spring Boot屬性配置