一铐尚、配置文件
1裳食、SpringBoot使用一個全局的配置文件,配置文件名是固定的辨赐;
- application.properties
- application.yml/application.yaml
k:(空格)v:表示一對鍵值對(空格必須有)优俘;
以空格的縮進(jìn)來控制層級關(guān)系;只要是左對齊的一列數(shù)據(jù)掀序,都是同一個層級的帆焕。
屬性和值也是大小寫敏感。
port: 8081
path: /hello
2不恭、值的寫法
字面量:普通的值(數(shù)字叶雹,字符串财饥,布爾)
k: v:字面直接來寫;
字符串默認(rèn)不用加上單引號或者雙引號折晦;
"":雙引號佑力;不會轉(zhuǎn)義字符串里面的特殊字符;特殊字符會作為本身想表示的意思
name: "zhangsan \n lisi":輸出筋遭;zhangsan 換行 lisi
'':單引號打颤;會轉(zhuǎn)義特殊字符,特殊字符最終只是一個普通的字符串?dāng)?shù)據(jù)
name: ‘zhangsan \n lisi’:輸出漓滔;zhangsan \n lisi
對象编饺、Map(屬性和值)(鍵值對):
k: v:在下一行來寫對象的屬性和值的關(guān)系;注意縮進(jìn)
對象還是k: v的方式
friends:
lastName: zhangsan
age: 20
//行內(nèi)寫法
friends: {lastName: zhangsan,age: 18}
數(shù)組(List响驴、Set):
用- 值表示數(shù)組中的一個元素
行內(nèi)寫法
pets:
‐ cat
‐ dog
‐ pig
//行內(nèi)寫法
pets: [cat,dog,pig]
3透且、配置文件值注入
配置文件
person:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
‐ lisi
‐ zhaoliu
dog:
name: 小狗
age: 12
#其中l(wèi)astName 可以是lastName,也可以last-name,或者last_name
javaBean:
/**
* 將配置文件中配置的每一個屬性的值豁鲤,映射到這個組件中
* @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進(jìn)行綁定秽誊;
* prefix = "person":配置文件中哪個下面的所有屬性進(jìn)行一一映射
*
* 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能琳骡;
*
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
我們可以導(dǎo)入配置文件處理器锅论,以后編寫配置就有提示了
<!‐‐導(dǎo)入配置文件處理器,配置文件進(jìn)行綁定就會有提示‐‐>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐configuration‐processor</artifactId>
<optional>true</optional>
</dependency>
@Value獲取值和@ConfigurationProperties獲取值比較
配置文件yml還是properties他們都能獲取到值楣号;
如果說最易,我們只是在某個業(yè)務(wù)邏輯中需要獲取一下配置文件中的某項值,使用@Value炫狱;
如果說藻懒,我們專門編寫了一個javaBean來和配置文件進(jìn)行映射,我們就直接使用@ConfigurationProperties视译;
4嬉荆、@PropertySource&@ImportResource&@Bean
@PropertySource:加載指定的配置文件;
/**
* 將配置文件中配置的每一個屬性的值酷含,映射到這個組件中
* @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進(jìn)行綁定鄙早;
* prefix = "person":配置文件中哪個下面的所有屬性進(jìn)行一一映射
*
* 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能第美;
* @ConfigurationProperties(prefix = "person")默認(rèn)從全局配置文件中獲取值蝶锋;
*
*/
@PropertySource(value = {"classpath:person.properties"})
@ImportResource:導(dǎo)入Spring的配置文件,讓配置文件里面的內(nèi)容生效什往;
Spring Boot里面沒有Spring的配置文件扳缕,我們自己編寫的配置文件,也不能自動識別;
想讓Spring的配置文件生效躯舔,加載進(jìn)來驴剔;@ImportResource標(biāo)注在一個配置類上
@ImportResource(locations = {"classpath:beans.xml"})
導(dǎo)入Spring的配置文件讓其生效
不來編寫Spring的配置文件
<?xml version="1.0" encoding="UTF‐8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring‐beans.xsd">
<bean id="helloService" class="com.atguigu.springboot.service.HelloService"></bean>
</beans>
SpringBoot推薦給容器中添加組件的方式;推薦使用全注解的方式
- 1粥庄、配置類@Configuration------>Spring配置文件
- 2丧失、使用@Bean給容器中添加組件
/**
* @Configuration:指明當(dāng)前類是一個配置類;就是來替代之前的Spring配置文件
*
* 在配置文件中用<bean><bean/>標(biāo)簽添加組件
*
*/
@Configuration
public class MyAppConfig {
//將方法的返回值添加到容器中惜互;容器中這個組件默認(rèn)的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置類@Bean給容器中添加組件了...");
return new HelloService();
}
}
5布讹、配置文件占位符
1、隨機數(shù)
${random.value}训堆、${random.int}描验、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2坑鱼、占位符獲取之前配置的值膘流,如果沒有可以是用:指定默認(rèn)值
person.last‐name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
6、配置錯誤
啟動項目若出現(xiàn)
java.lang.IllegalStateException: Failed to load property source from location
'classpath:/applicatio
- yml的語法格式有誤
-
文件的編碼問題
- 刪除application.yml文件中所有中文注釋
- 把spring 3.2的jar包全都換成4.0的鲁沥,可能是版本的問題
- 注釋錯誤引起(application.yml采用的是#注釋而不是//)
- 縮進(jìn)采用tab而不是空格引起的(不同配置之間也不能有tab出現(xiàn)呼股,否則會報錯)
- 冒號后面必須有空格否則會報錯
7、Profile
1画恰、多Profile文件
我們在主配置文件編寫的時候彭谁,文件名可以是 application-{profile}.properties/yml
默認(rèn)使用application.properties的配置;
2阐枣、yml支持多文檔塊方式
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
3马靠、激活指定profile
- 1、在配置文件中指定 spring.profiles.active=dev
- 2蔼两、命令行:
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
可以直接在測試的時候逞度,配置傳入命令行參數(shù)
- 3额划、虛擬機參數(shù);
-Dspring.profiles.active=dev
8档泽、配置文件加載位置
springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認(rèn)配置文件
- –file:./config/
- –file:./
- –classpath:/config/
-
–classpath:/
優(yōu)先級由高到底俊戳,高優(yōu)先級的配置會覆蓋低優(yōu)先級的配置;
SpringBoot會從這四個位置全部加載主配置文件馆匿;互補配置抑胎;
我們還可以通過spring.config.location來改變默認(rèn)的配置文件位置
項目打包好以后,我們可以使用命令行參數(shù)的形式渐北,啟動項目的時候來指定配置文件的新位置阿逃;指定配置文件和默
認(rèn)加載的這些配置文件共同起作用形成互補配置;
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar
--spring.config.location=G:/application.properties
9、外部配置加載順序
SpringBoot也可以從以下位置加載配置恃锉; 優(yōu)先級從高到低搀菩;高優(yōu)先級的配置覆蓋低優(yōu)先級的配置,所有的配置會形成互補配置
- 1.命令行參數(shù)
所有的配置都可以在命令行上進(jìn)行指定
多個配置用空格分開破托; --配置項=值
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087
--server.context-path=/abc
- 2.來自java:comp/env的JNDI屬性
- 3.Java系統(tǒng)屬性(System.getProperties())
- 4.操作系統(tǒng)環(huán)境變量
- 5.RandomValuePropertySource配置的random.*屬性值
由jar包外向jar包內(nèi)進(jìn)行尋找肪跋;
優(yōu)先加載帶profile
- 6.jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
- 7.jar包內(nèi)部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
再來加載不帶profile
- 8.jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
- 9.jar包內(nèi)部的application.properties或application.yml(不帶spring.profile)配置文件
- 10.@Configuration注解類上的@PropertySource
- 11.通過SpringApplication.setDefaultProperties指定的默認(rèn)屬性
所有支持的配置加載來源;