springboot配置

一铐尚、配置文件

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)屬性
    所有支持的配置加載來源;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末土砂,一起剝皮案震驚了整個濱河市州既,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萝映,老刑警劉巖吴叶,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锌俱,居然都是意外死亡晤郑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門贸宏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來造寝,“玉大人,你說我怎么就攤上這事吭练〗肓” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵鲫咽,是天一觀的道長签赃。 經(jīng)常有香客問我,道長分尸,這世上最難降的妖魔是什么锦聊? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮箩绍,結(jié)果婚禮上孔庭,老公的妹妹穿的比我還像新娘。我一直安慰自己材蛛,他們只是感情好圆到,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卑吭,像睡著了一般芽淡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豆赏,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天挣菲,我揣著相機與錄音富稻,去河邊找鬼。 笑死己单,一個胖子當(dāng)著我的面吹牛唉窃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纹笼,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纹份,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了廷痘?” 一聲冷哼從身側(cè)響起蔓涧,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笋额,沒想到半個月后元暴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡兄猩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年茉盏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枢冤。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸠姨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淹真,到底是詐尸還是另有隱情讶迁,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布核蘸,位于F島的核電站巍糯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏客扎。R本人自食惡果不足惜祟峦,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望徙鱼。 院中可真熱鬧搀愧,春花似錦、人聲如沸疆偿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杆故。三九已至,卻和暖如春溉愁,著一層夾襖步出監(jiān)牢的瞬間处铛,已是汗流浹背饲趋。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撤蟆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像恩脂,于是被迫代替她去往敵國和親畸颅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容