全局配置文件可以對一些默認的配置值進行修改。Spring Boot使用一個application.properties或application.yml/application.yaml的文件做爲全局配置文件,該文件放在 【src/main/resources】目錄或者類路徑的 【/config】,java
通常爲放在resources目錄。spring
咱們能夠在 application.properties / application.yml文件中定義Spring Boot定義項目的相關屬性,固然,這些屬性能夠是系統屬性、環境變量、命令參數等信息,也能夠是自定義配置文件名稱和位置。數組
# 指定項目運行端口 server.port=8080 # 指定項目應用上下文路徑 server.servlet.context-path=/learn # 指定項目名 spring.application.name=learn
編寫配置時,因爲咱們配置的Person對象屬性是咱們自定義的,Spring Boot 沒法自動識別,全部不會有任何屬性提示。在實際開發中,爲了出現代碼提示的效果方便配置,在使用@ConfigurationProperties註解進行配置文件屬性注入時,能夠在pom.xml文件中添加Spring Boot提供的配置處理依賴器。markdown
<!-- 配置處理器依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
添加配置後,須要從新編譯、運行項目便可生效。app
首先準備兩個實體類:Pet、Person,下面經過application.properties和application.yml配置文件中的自定義配置屬性注入到Person實體類中框架
@Data public class Pet { private String type; private String name; }
@Data @Component @ConfigurationProperties(prefix = "person") public class Person { private int id; // id private String name; // 名稱 private List hobby; // 愛好 private String[] family; // 家庭成員 private Map map; private Pet pet; // 寵物 }
@ConfigurationProperties(prefix = "person")註解的做用是將配置文件中以person開頭的屬性值經過setXXX()方法注入到實體類中less
@Component註解的做用是將當前注入屬性值的Person類對象做爲Bean組件放到Spring容器中,只有這樣才能被@ConfigurationProperties賦值dom
person.id=1 person.name=張三 person.hobby=吃飯,睡覺,打豆豆 person.family=father,mother person.map.k1=v1 person.map.k3=v2 person.pet.type=cat person.pet.name=麻花
測試類ide
// 測試啓動類,並加載Spring Boot測試註解 @RunWith(SpringRunner.class) // 標記爲Spring Boot單元測試類,並加載項目的ApplicationContext上下文環境 // classes 知道項目主程序啓動類 @SpringBootTest(classes = LearnApplication.class) public class LearnApplicationTest { @Autowired private Person person; @Test public void testProperties() { System.out.println(person); } }
打印結果spring-boot
Person(id=1, name=張三, hobby=[吃飯, 睡覺, 打豆豆], family=[father, mother], map={k1=v1, k3=v2}, pet=Pet(type=cat, name=麻花))
能夠看出,正確打印出了Person類對象,說明application.properties配置文件屬性配置正確,並經過相關注解自動完成了屬性注入。
yaml文件格式是Spring Boot支持的一種JSON超集文件格式,相比傳統的properties配置文件,yaml文件以數據爲核心,是一種更爲直觀且容易被電腦識別的數據序列化格式。application.yaml配置文件的工做原理和application.properties是同樣的,只不過yaml格式配置文件看起來更加簡潔一些。
針對不一樣的數據類型有不一樣的格式
value值爲普通數據類型(數字,字符串、布爾等)
server: port: 8081 spring: application: name: demo
value值爲數組和單列集合
主要有兩種書寫方式:縮進式寫法和行內寫法
person: hobby: - 吃飯 - 睡覺 - 打豆豆
或
person: hobby: 吃飯, 睡覺, 打豆豆
person: hobby: [吃飯,睡覺,打豆豆]
或
person: hobby: 吃飯,睡覺,打豆豆
value值爲Map集合和對象
主要有兩種書寫方式:縮進式寫法和行內寫法
person: map: k1: v1 k2: v2
person: map: {k1: v1-1,k2: v2-2}
測試
在resources下建立 application.yml
person: id: 1 name: 羅傑 hobby: [吃飯,睡覺,打豆豆] family: father,mother map: {k1: v1-1,k2: v2-2} pet: type: cat name: 麻花
測試類
// 測試啓動類,並加載Spring Boot測試註解 @RunWith(SpringRunner.class) // 標記爲Spring Boot單元測試類,並加載項目的ApplicationContext上下文環境 // classes 知道項目主程序啓動類 @SpringBootTest(classes = LearnApplication.class) public class LearnApplicationTest { @Autowired private Person person; @Test public void testProperties() { System.out.println(person); } }
打印結果
Person(id=1, name=張三, hobby=[吃飯, 睡覺, 打豆豆], family=[father, mother], map={k1=v1, k3=v2}, pet=Pet(type=cat, name=麻花))
能夠看出,正確打印出了Person類對象,說明application.yml配置文件屬性配置正確,並經過相關注解自動完成了屬性注入。
使用Spring Boot進行全局配置文件設置時:
Spring Boot支持多種注入配置文件屬性的方式,@ConfigurationProperties和@Value方式
Spring Boot 提供 @ConfigurationProperties 註解用來快速、方便的將配置文件中自定義的屬性批量注入到某個Bean對象的多個屬性中。
如
@Data @Component @ConfigurationProperties(prefix = "person") public class Person { private int id; // id private String name; // 名稱 private List hobby; // 愛好 private String[] family; // 家庭成員 private Map map; private Pet pet; // 寵物 }
上述代碼使用 @Component 和 @ConfigurationProperties(prefix = "person")將配置文件中的每一個屬性映射到Person類組件中。
@Value是 Spring 框架提供的,用來讀取配置文件中的屬性值,並逐個注入到Bean對象的對應屬性中,Spring Boot從Spring框架中對@Value註解進行了默認繼承,因此在Spring Boot框架中還可使用該註解讀取和注入配置文件屬性值。
如
@Data @Component public class People { @Value("${people.id}") private Integer id; @Value("${people.name}") private String name; }
people: id: 1 name: 李四
測試結果
People(id=1, name=李四)
能夠看出,屬性值正確打印,經過@Value能夠進行配置文件屬性值進行注入。
使用@Value註解使用注意事項
若是使用@Value,在配置文件中配置對應屬性或者設置默認值,不然會出現異常
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'people.name' in value "${people.name}"
默認值設置方式示例
@Data @Component public class People { @Value("${people.id:10}") private Integer id; @Value("${people.flag:true}") private Boolean flag; // 設置默認值爲空字符串 @Value("${people.name:}") private String name; // 設置默認值爲null @Value("${people.remark:#{null}}") private String remark; }
@Value註解對Map集合、對象以及yml文件格式的行內式寫法的配置文件的屬性注入都不支持,若是賦值會出現錯誤
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'people.name' in value "${people.name}"
Spring Boot免除了項目中大部分的手動配置,對於一些特定狀況,咱們能夠經過修改全局配置文件以適應具體生成環境,能夠說,幾乎全部的配置均可以寫在application.properties配置文件中,Spring Boot會自動加載全局配置文件從而免除咱們手動加載的煩惱。
可是,若是咱們自定義配置文件,Spring Boot是沒法識別這些配置文件的,此時須要咱們手動加載。
對應這種加載自定義配置文件的需求,可使用@PropertySource註解結合@Component註解的方式來實現。
@PropertySource註解做用是用於指定自定義配置文件的具體位置和名稱,同時,爲了保證Spring Boot可以掃描該註解,還須要在其類上添加@Component,代表該類交於Spring容器進行維護。
固然對於自定義配置文件中的屬性值注入到對應的類屬性值中,可使用@ConfigurationProperties或者@Value註解進行屬性值注入
示例
建立test.properties
test.id=1 test.name=zhangsan
建立配置類
@Data @Component // 引入自定義配置文件的名稱和位置 @PropertySource(value = "classpath:test.properties", encoding = "UTF-8") @ConfigurationProperties(prefix = "test") public class MyProperties { private int id; private String name; }
測試
// 測試啓動器,並加載Spring boot 測試註解 @RunWith(SpringRunner.class) // 標記該類爲Spring boot 單元測試類,並加載項目的ApplicationContext上下文環境 @SpringBootTest class SpringbootDemoApplicationTests { @Autowired private MyProperties myProperties; @Test void contextLoads() { System.out.println(myProperties); } }
在Spring Boot框架中,推薦使用配置類的方式向容器中配置和組件
在Spring Boot框架中,一般使用 @Configuration 註解定義一個配置類,Spring Boot 會自動掃描和識別配置類,從而替換傳統Spring框架中的XML配置文件。
當定義一個配置類後,還須要在類中的方法上使用@Bean註解進行組件配置,將方法的返回對象注入到Spring容器中,而且組件名稱默認爲方法名,固然也可使用@Bean註解的name、value屬性自定義組件的名稱。
建立Config配置類
// 標明該類爲配置類 @Configuration public class MyConfig { @Bean // 將返回值對象做爲組件,添加到Spring容器中,標識id默認爲方法名或者自定義@Bean(id) public MyService myService() { return new MyService(); } }
測試
// 測試啓動器,並加載Spring boot 測試註解 @RunWith(SpringRunner.class) // 標記該類爲Spring boot 單元測試類,並加載項目的ApplicationContext上下文環境 @SpringBootTest class SpringbootDemoApplicationTests { @Autowired private ApplicationContext applicationContext; @Test void contextLoads() { boolean myService = applicationContext.containsBean("myService"); System.out.println(myService); } }
在Spring Boot配置文件中,隨機值設置使用到了Spring Boot內嵌的RandomValuePropertySource類,對一些隱祕屬性值或者測試用例屬性值進行隨機值注入
隨機值設置的語法格式爲 ${random.xx},xx標識須要指定生成的隨機數類型和範圍,能夠是整數,uuid,或者字符串
@Data @Component @ConfigurationProperties(prefix = "myr") public class MyRandom { private String secret; // 配置隨機值 private Integer number; // 配置隨機整數 private Long bignumber; // 配置隨機Long類型整數 private String uuid; // 配置隨機uuid private int lessthanten; // 配置小於10的隨機整數 private int range; // 配置範圍在[1024,5048]之間的隨機整數 }
myr: secret: ${random.value} # 配置隨機值 number: ${random.int} # 配置隨機整數 bignumber: ${random.long} # 配置隨機Long類型整數 uuid: ${random.uuid} # 配置隨機uuid lessthanten: ${random.int(10)} # 配置小於10的隨機整數 range: ${random.int[1024,5048]} # 配置範圍在[1024,5048]之間的隨機整數
在Spring Boot配置文件中,配置文件的 屬性值還能夠進行參數間的引用,也就是在後一個配置的屬性值中引用先前已經定義多的屬性,這樣就能夠直接解析其中的屬性值了。
參數間引用的語法格式:${xxx},xxx表示先前在配置文件中已經配置過的屬性名
好處:多處引用,一處配置
@Data @Component @ConfigurationProperties(prefix = "app") public class App { private String name; private String describe; }
app: name: 測試APP describe: ${app.name}是用來測試的