SpringBoot配置文件
SpringBoot使用一個全局的配置文件,配置文件名是固定的;
- application.properties
- application.yml
配置文件的作用:修改SpringBoot自動配置的默認值; SpringBoot在底層就自動配置好;
配置文件加載位置
1、springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認配置文件
1 –file:./config/ 2 –file:./ 3 –classpath:/config/ 4 –classpath:/ 優先級由高到底,高優先級的配置會覆蓋低優先級的配置;
SpringBoot會從這四個位置全部加載主配置文件;互補配置;
2、可以通過spring.config.location來改變默認的配置文件位置
項目打包好以后,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定配置文件和默認加載的這些配置文件共同起作用形成互補配置;
命令:java -jar spring-boot-config-1.0-SNAPSHOT.jar --spring.config.location=application.properties
3、外部配置加載順序
SpringBoot也可以從以下位置加載配置; 優先級從高到低;高優先級的配置覆蓋低優先級的配置,所有的配置會形成互補配置
1 1.命令行參數 所有的配置都可以在命令行上進行指定 2 java -jar spring-boot-config-1.0-SNAPSHOT.jar --server.port=8087 -- server.context-path=/abc 多個配置用空格分開; --配置項=值 3 2.來自java:comp/env的JNDI屬性 4 3.Java系統屬性(System.getProperties()) 5 4.操作系統環境變量 6 5.RandomValuePropertySource配置的random.*屬性值由jar包外向jar包內進行尋找; 7 8 優先加載帶profile 9 6.jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件 10 7.jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件 11 12 再來加載不帶profile 13 8.jar包外部的application.properties或application.yml(不帶spring.profile)配置文件 14 9.jar包內部的application.properties或application.yml(不帶spring.profile)配置文件 15 10.@Configuration注解類上的@PropertySource 16 11.通過SpringApplication.setDefaultProperties指定的默認屬性 所有支持的配置加載來源;
YAML簡介
AML(YAML Ain't Markup Language)
YAML A Markup Language:是一個標記語言
YAML isn't Markup Language:不是一個標記語言;
標記語言:以前的配置文件; 大多都使用的是 xxxx.xml文件; YAML:以數據為中心,比json、xml等更適合做配置文件;
YAML:配置例子
1 server: 2 port: 8081
properties文件:
1 server.port= 8081
YAML語法
1、基本語法
k:(空格)v
表示一對鍵值對(空格必須有); 以空格的縮進來控制層級關系;只要是左對齊的一列數據,都是同一個層級的;
屬性和值也是大小寫敏感;
1 server: 2 port: 8081 3 path: /hello
2、值的寫法
字面量:普通的值(數字,字符串,布爾)
k: v == 字面直接來寫;
字符串默認不用加上單引號或者雙引號;
"":雙引號; 不會轉義字符串里面的特殊字符; 特殊字符會作為本身想表示的意思 name: "zhangsan \n lisi":輸出;zhangsan 換行 lisi
'':單引號; 會轉義特殊字符,特殊字符最終只是一個普通的字符串數據 name: ‘zhangsan \n lisi’:輸出;zhangsan \n lisi
對象、Map(屬性和值)(鍵值對):
k: v == 在下一行來寫對象的屬性和值的關系;注意縮進
對象還是k: v的方式
1 friends: 2 lastName: zhangsan 3 age: 20
行內寫法:
1 friends: {lastName:zhangsan, age:18}
數組(List、Set):
用- 值表示數組中的一個元素
1 pets: 2 ‐cat 3 ‐dog 4 ‐pig
行內寫法
1 pets: [cat,dog,pig]
配置文件值注入
配置文件
1 person: 2 lastName: hello 3 age: 18 4 boss: false 5 birth: 2017/12/12 6 maps: {k1: v1,k2: 12} 7 lists: 8 ‐ lisi 9 ‐ zhaoliu 10 dog: 11 name: 小狗 12 age: 12
javaBean
1 /** 2 * 將配置文件中配置的每一個屬性的值,映射到這個組件中 3 * @ConfigurationProperties 將本類中的所有屬性和配置文件中相關的配置進行綁定; 4 * prefix = "person" : 配置文件中哪個下面的所有屬性 5 * 只有這個組件是容器中的組件,此啊能使用容器提供的@ConfigurationProperties功能 6 * 7 */ 8 // @PropertySource(value = {"classpath:person.properties"}) 9 @Component 10 @ConfigurationProperties(prefix = "person") 11 public class Person { 12 13 private String lastName; 14 private Integer age; 15 private Boolean boss; 16 private Date birth; 17 18 private Map<String, Object> maps; 19 private List<Object> lists; 20 21 private Dog dog;
注意:導入配置文件處理器,即pom文件中增加下面依賴,以后在編寫配置文件時就有提示了
1 <!-- 導入配置文件處理器,配置文件進行綁定會有提示 --> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-configuration-processor</artifactId> 5 <optional>true</optional> 6 </dependency>
a、*.properties文件亂碼問題,idea中默認utf-8可能會亂碼,調整settings
b、@Value獲取值和@ConfigurationProperties獲取值比較
@ConfigurationProperties |
@Value |
|
功能 |
批量注入配置文件中的屬性 |
一個個指定 |
松散綁定(松散語法) |
支持 |
不支持 |
SpEL |
不支持 |
支持 |
JSR303數據校驗 |
支持 |
不支持 |
復雜類型封裝 |
支持 |
不支持 |
配置文件yml還是properties他們都能獲取到值;
如果說,只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value;
如果說,專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;
c、配置文件注入值數據校驗
1 @Component 2 @ConfigurationProperties(prefix = "person") 3 @Validated 4 public class Person { 5 6 //lastName必須是郵箱格式 7 @Email //@Value("${person.last‐name}") 8 private String lastName; 9 //@Value("#{11*2}") 10 private Integer age; 11 //@Value("true") 12 private Boolean boss; 13 private Date birth; 14 private Map<String,Object> maps; 15 private List<Object> lists; 16 private Dog dog;
d、@PropertySource&@ImportResource&@Bean
@PropertySource: 加載指定的配置文件;
1 @Component 2 @ConfigurationProperties(prefix = "person") 3 @PropertySource(value={"classpath:person.properties"}) 4 public class Person {
@ImportResource: 導入Spring的配置文件,讓配置文件里面的內容生效;
Spring Boot里面沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別;
想讓Spring的配置文件生效,加載進來;@ImportResource標注在一個配置類上
1 // 導入Spring的配置文件讓其生效 2 @ImportResource(locations={"classpath:beans.xml"})
SpringBoot推薦給容器中添加組件的方式;推薦使用全注解的方式
1、配置類@Configuration------>Spring配置文件
2、使用@Bean給容器中添加組件
1 /** 2 * @Configuration:指明當前類是一個配置類:就是用來替代之前的Spring配置文件 3 * 4 * 在配置文件中用<bean></bean>標簽添加的組件 5 */ 6 @Configuration 7 public class MyAppConfig { 8 9 /** 10 * 將方法的返回值添加到容器中 11 * 容器中這個組件的ID就是方法名 12 */ 13 @Bean 14 public HelloService helloService02(){ 15 System.out.println("配置類@Bean給容器添加組件。。。"); 16 return new HelloService(); 17 } 18 }
配置文件占位符
1、隨機數
1 ${random.value}、${random.int}、${random.long} 2 ${random.int(10)}、${random.int[1024,65536]}
2、占位符獲取之前配置的值,如果沒有可以是用:指定默認值
1 person.last‐name=張三${random.uuid} 2 person.age=${random.int} 2 person.birth=2017/12/15 3 person.boss=false 4 person.maps.k1=v1 5 person.maps.k2=14 6 person.lists=a,b,c 7 person.dog.name=${person.hello:hello}_dog 8 person.dog.age=15
Profile文件
1、多Profile文件
在主配置文件編寫的時候,文件名可以是 application-{profile}.properties/yml
默認使用application.properties的配置;
2、yml支持多文檔塊方式
1 server: 2 port: 8081 3 spring: 4 profiles: 5 active: prod 6 ‐‐‐ server: 7 port: 8083 8 spring: 9 profiles: dev 10 ‐‐‐ 11 server: 12 port: 8084 13 spring: 14 profiles: prod #指定屬於哪個環境
3、激活指定profile文件
a、在配置文件中指定 spring.profiles.active=dev
b、命令行: java -jar spring-boot-1.0-SNAPSHOT.jar --spring.profiles.active=dev; 可以直接在測試的時候,配置傳入命令行參數
c、虛擬機參數; -Dspring.profiles.active=dev