配置文件
SpringBoot 的熱部署
Spring為開發者提供了一個名為spring-boot-devtools的模塊來使SpringBoot應用支持熱部署,提高開發者的開發效率,無需手動重啟SpringBoot應用
相關依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional>
</dependency>
修改Java代碼或者配置文件模塊后可以通過ctrl+F9來實施熱部署
配置文件
SpringBoot使用一個全局的配置文件,配置文件名是固定的
- application.properties
- application.yml
配置文件的作用:修改SpringBoot自動配置的默認值。
YML:配置例子
server:port: 8080
XML:配置例子
<server><port>8080</port>
</server>
YML語法
基本語法
k:(1空格)v: 表示一對鍵值對(1個空格必須有)
以空格的縮進來控制層級關系,只要是左對齊的一列數據,都是同一個層級的
server:port: 8080path: /hello
其中的屬性和值也是大小寫敏感
值的寫法
字符串默認不用加上單引號或雙引號
“”:雙引號:會轉義字符串里面的特殊字符,特殊字符會作為本身想表示的意思,比如換行符(\n),如圖:
我在雙引號中間寫了一個換行符,那么控制臺輸出這一行 person 信息的時候就會在 Jonathan 后面換行,如:
‘’:單引號:不會轉義特殊字符,特殊字符只是一個普通的字符串數據,如圖:
這次我把雙引號換成了單引號,控制臺輸出的時候就不會換行了,只會把換行符當成普通字符處理,如:
對象,Map
對象
還是 k: v 的方式
friends:name: zhangsan age: 20
行內寫法:
friends: {name: zhangsan,age: 18}
數組
用 - 值表示數組中的一個元素
pets:- cat- dog- pig
行內寫法:
pets: {cat,dog,pig}
配置文件注入
配置文件:
person:name: 'Jonathan \n xxx'age: 27sex: "true"birthday: "1993/05/01"lists: [1,2,3]maps: {k1: 1,k2: 2,k3: 3}
javaBean:
/*** @ConfigurationProperties(prefix = "person")告訴SpringBoot將本類中的所有屬性 * 和配置文件中相關的配置進行綁定*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {private String name;private int age;private boolean sex;private Date birthday;private List<Object> lists;private Map<String, Object> maps;
}
在這里我們可以導入配置文件處理器,以后編寫配置就有提示了
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐configuration‐processor</artifactId><optional>true</optional>
</dependency>
我們可以通過另一種方式獲取值
@Value和@ConfigurationProperties的區別
@Value | @ConfigurationProperties | |
---|---|---|
功能 | 一個個指定 | 批量注入配置文件中的屬性 |
松散綁定(松散語法) | 不支持 | 支持 |
SpEL | 支持 | 不支持 |
JSR303數據校驗 | 不支持 | 支持 |
復雜類型封裝 | 不支持 | 支持 |
@Value是一一綁定的
@ConfigurationProperties支持松散綁定
數據校驗:
只有前綴支持
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {@Emailprivate String email;
}
對于復雜封裝類型 @Value 不適合,比如:
private List<Object> lists;private Map<String, Object> maps;
@PropertySource
/*** 將配置文件中配置的每一個屬性的值,映射到這個組件中* @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定;* prefix = "person":配置文件中哪個下面的所有屬性進行一一映射* *只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能;* @ConfigurationProperties(prefix = "person")默認從全局配置文件中獲取值;* */@PropertySource(value = {"classpath:person.properties"})@Component@ConfigurationProperties(prefix = "person")//@Validatedpublic class Person {/*** <bean class="Person">* <property name="lastName" value="字面量/${key}從環境變量、配置文件中獲取值/#{SpEL}"></property>* <bean/>*///lastName必須是郵箱格式// @Email//@Value("${person.last‐name}")private String lastName;//@Value("#{11*2}")private Integer age;//@Value("true")private Boolean boss;
@ImportResource:
導入Spring的配置文件,讓配置文件里面的內容生效;
Spring Boot里面沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別;
想讓Spring的配置文件生效,加載進來,就把@ImportResource放在SpringBoot啟動類上
package com.qcby.springbootdemo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;@ImportResource({"classpath:bean.xml"})
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
Profile
多Profile文件
我們在主配置文件編寫的時候,文件名可以是 application-dev.properties
默認使用 application-dev.properties 的配置
yml支持多文檔塊方式
server:port: 8081
person:name: 'Jonathan \n xxx'age: 27sex: "true"birthday: "1993/05/01"lists: [1,2,3]maps: {k1: 1,k2: 2,k3: 3}
---
server:port: 8082
spring:config:activate:profiles: dev
---
server:port: 8083
spring:config:activate:profiles: prod
激活指定profile
在配置文件中指定 spring.profiles.active=dev
命令行:
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
配置文件加載位置
springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
優先級由高到底,高優先級的配置會覆蓋低優先級的配置;
SpringBoot會從這四個位置全部加載主配置文件;互補配置;
優先級如圖: