1、配置文件
SpringBoot使用一個全局的配置文件障陶,配置文件名是固定的滋恬;
- application.properties
- application.yml
配置文件的作用:修改SpringBoot自動配置的默認(rèn)值;SpringBoot在底層都給我們自動配置好咸这;
YAML 是一個標(biāo)記語言
標(biāo)記語言:
以前的配置文件夷恍;大多都使用的是xxx.xml文件
YAML:以數(shù)據(jù)為中心,比json媳维、xml等更適合做配置文件
YAML:配置例子
server:
port: 8081
XML:
<server>
<port>8081</port>
</server>
2、YAML語法
2.1遏暴、基本語法
k:(空格)v : 表示一對鍵值對(空格必須有)
以空格的縮進(jìn)來控制層級關(guān)系侄刽;只要是左對齊的一列數(shù)據(jù),都是同一個層級的
server:
port: 8081
path: /hello
屬性和值也是大小寫敏感朋凉;
2.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ù)組中的一個元素
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: v2}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 12
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>
3.1、properties配置文件在idea中默認(rèn)UTF-8可能會亂碼
調(diào)整 圖示:
3.2治拿、@Value獲取值和@ConfigurationProperties獲取值比較
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的屬性 | 一個個指定 |
松散綁定(松散語法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303數(shù)據(jù)校驗 | 支持 | 不支持 |
復(fù)雜類型封裝 | 支持 | 不支持 |
配置文件yml還是properties他們都能獲取到值摩泪;
如果說,我們只是在某個業(yè)務(wù)邏輯中需要獲取一下配置文件中的某項值劫谅,使用@Value
如果說见坑,我們專門編寫一個javaBean來和配置文件進(jìn)行映射,我們就直接使用@ConfigurationProperties
3.3捏检、配置文件注入值數(shù)據(jù)校驗
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@Email
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
3.4荞驴、@PropertySource,@Import,@Bean
@PropertySource:加載指定的配置文件
/**
將配置文件中配置的每一個屬性的值,映射到這個組件中
@ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進(jìn)行綁定贯城;
prefix=“person”:配置文件中哪個下面的所有屬性進(jìn)行一一映射
@Component
只有這個組件是容器中的組件熊楼,才能容器提供的@ConfigurationProperties功能
@ConfigurationProperties(prefix="person")默認(rèn)從全局配置文件中獲取值
**/
@Component
@PropertySource(value = {"classpath:person.properties"})
@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;
@ImportResource:導(dǎo)入Spring的配置文件,讓配置文件里面的內(nèi)容生效
SpringBoot里面沒有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="person" class="com.bwie.entity.Person">
<property name="lastName" value="lisi"/>
</bean>
</beans>
Spring Boot推薦給容器添加組件的方式;推薦全注解的方式
1渡蜻、配置類@Configuration------>Spring配置文件
2术吝、使用@Bean給容器中添加組件
@Configuration
public class MyAppConfig {
//將方法的返回值 添加到容器中;容器中這個組件默認(rèn)的id就是方法名
@Bean
public Dog HelloDog(){
return new Dog("旺財","拉布拉多");
}
}
4茸苇、配置文件占位符
4.1排苍、隨機數(shù)
${random.value},${random.int},${random.long}
${random.int(10)},${random.int[1024,65536]}
4.2学密、占位符獲取之前配置的值淘衙,如果沒有可以使用:指定默認(rèn)值
person.lastName=zhangsan${random.uuid}
person.age=${random.int(10)}
person.boss=false
person.birth=2011/12/12
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.lastName:hello}_dog
person.dog.type=拉布拉多
5、profile
5.1则果、多profile文件
我們在主配置文件編寫的時候幔翰,文件名可以是application-{profile}.properties/yml
默認(rèn)使用application.properties的配置
5.2、yml支持多文檔塊方式
server:
port: 8081
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
#person:
5.3西壮、激活指定profile
1遗增、在配置文件中指定spring.profiles.active=dev
2、在命令行:
java -jar spring-boot-02-config.jar --spring.profiles.active=dev;
可以直接在測試的時候款青,配置傳入命令行參數(shù)
3.虛擬機參數(shù)
-Dspring.profiles.active=dev
6做修、配置文件加載位置
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.jar --spring.config.location=G:/application.properties
7燎含、外部配置加載順序
==SpringBoot也可以從以下位置加載配置宾濒;優(yōu)先級從高到低;高優(yōu)先級的配置低優(yōu)先級的配置屏箍,所有的配置會形成互補配置==
1.命令行參數(shù)
2.來自java:comp/env的JNDI屬性
3.java系統(tǒng)屬性
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)配置文件
精髓:
1》springboot啟動會加載大量的自動配置類
2》我們看我們需要的功能有沒有springboot默認(rèn)寫好的自動配置類
3》我們再來看這個自動配置類中到底配置了那些組件绘梦;(只要我們要用的組件有,我們就不需要再來配置了)
4》給容器中自動配置類添加組件的時候赴魁,會從properties類中獲取某些屬性卸奉,我們就可以在配置文件中指定這些屬性的值