文章目錄
歡迎訪問筆者個人技術博客:http://rukihuang.xyz/
二、配置文件
2.1 配置文件
-
SpringBoot使用一個全局配置文件,配置文件名是固定的
application.properties
application.yml
-
作用:由於SpringBoot在底層已經幫助我們自動配置了,而配置文件則幫助修改SpringBoot自動配置的默認值。
2.2 YAML語法
2.2.1 基本語法
k: v
:表示一對鍵值對(空格必須有)- 以空格的縮進來控制層級關係,只要左對齊的一列數據,都是同一個層級的
- 屬性和值都是大小寫敏感的
person:
name: 張帥
age: 18
birth: 1998/12/01
boss: false
friends:
- 張三
- 李四
- 王五
map:
k1: v1
k2: v2
pet:
name: doggy
age: 2
2.2.2 值的寫法
2.2.2.1 普通的值(數字、字符串、布爾)
k: v
:字面直接來寫- 字符串默認不用加上單引號或雙引號
""
:雙引號,不會轉義(有特殊)字符串裏面的特殊字符;特殊字符會作爲本身想表示的意思name: "zhangsan \n lisi"
:輸出爲zhangsan 換行 lisi
''
:單引號,會轉義特殊字符,特殊字符最終只是一個普通的字符串數據name: 'zhangsan \n lisi'
:輸出爲zhangsan \n lisi
2.2.2.2 對象、Map(屬性和值、鍵值對)
- 對象還是
k: v
的方式
person:
map:
k1: v1
k2: v2
pet:
name: doggy
age: 2
- 行內寫法
pet: {name: doggy, age: 2}
2.3 配置文件注入
- 配置文件:
application.yaml
person:
name: 張帥
age: 18
birth: 1998/12/01
boss: false
friends:
- 張三
- 李四
- 王五
map:
k1: v1
k2: v2
pet:
name: doggy
age: 2
- javaBean:
Person
/**
* 將配置文件中配置的每一個屬性的值,映射到這個組件中
* @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定;
* prefix = "person":配置文件中哪個下面的所有屬性進行一一映射
*
* 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Component //註解表明一個類會作爲組件類,並告知Spring要爲這個類創建bean
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private Date birth;
private boolean boss;
private List<String> friends;
private Map<String, String> map;
private Dog pet;
-
@Component
和@Bean
的區別@Component
註解表明一個類會作爲組件類,並告知Spring要爲這個類創建bean。@Bean
註解告訴Spring這個方法將會返回一個對象,這個對象要註冊爲Spring應用上下文中的bean。通常方法體中包含了最終產生bean實例的邏輯。
-
在pom文件中添加依賴,編寫配置就會有提示
<!--導入配置文件處理器,配置文件進行綁定就會有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2.3.1 @Value獲取值和@ConfigurationProperties獲取值比較
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的屬性 | 一個個指定 |
鬆散綁定(鬆散語法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303數據校驗 | 支持 | 不支持 |
複雜類型封裝 | 支持 | 不支持 |
- yml和properties文件都能獲取到值
- 如果只需要獲取配置文件中的某個單個的值,使用
@Value
- 如果專門編寫了javaBean來和配置文件進行映射,使用
@ConfigurationProperties
- 如果只需要獲取配置文件中的某個單個的值,使用
2.3.2 配置文件注入值數據校驗 @Validated
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public 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;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
- 加入
@Validated
註解後,可以使用格式註解,對注入的數據進行校驗
2.3.3 @PropertySource/@ImportResource/@Bean
@PropertySource
:加載指定的配置文件
@Component
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private Date birth;
private boolean boss;
private List<String> friends;
private Map<String, String> map;
private Dog pet;
person.name=張三
person.age=18
person.boss=false
person.birth=1998/2/5
person.friends=a,b,c
person.map.k1=v1
person.map.k2=v2
person.pet.name=doggy
person.pet.age=2
@ImportResource
:導入spring的配置文件,讓配置文件中的內容生效,且必須標註砸一個配置類上(@Configuration
)
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class SpringBootPrac02Application {
<!--bean.xml-->
<?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.ruki.springboot.service.HelloService"></bean>
</beans>
- SpringBoot推薦使用全註解方式給容器添加組件
@Configuration
配置類:Spring配置文件@Bean
給容器中添加組件
/**
* @Configuration:指明當前類是一個配置類;就是來替代之前的Spring配置文件
*
* 在配置文件中用<bean><bean/>標籤添加組件
*
*/
@Configuration
public class MyAppConfig {
//將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置類@Bean給容器中添加組件了...");
return new HelloService();
}
}
2.4 配置文件佔位符
2.4.1 隨機數
${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}
2.4.2 獲取之前配置的值
- 如果沒有可以指定默認值
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
2.5 Profile
- 實際開發中存在多種環境
dev
:開發prod
:生產test
:測試
2.5.1 多profile文件
- 因此主配置文件會隨着不同的生產環境而產生多個文件
application-{profile}.properties
2.5.2 yml支持多文檔塊的方式
- 使用三條短線
---
分隔文檔塊
server:
port: 8081
spring:
profiles:
active: prod #激活prod生產環境,因此端口爲8084
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod #指定屬於哪個環境
2.5.4 激活指定profile
- 在配置文件中指定
spring.profiles.active=dev
- 命令行:在最後加上
--spring.profiles.active=dev
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
- 虛擬機參數 vmoption:
-Dspring.profiles.active=dev
2.6 配置文件加載順序
- springboot啓動會掃描一下位置的
application.properties
或application.yml
文件作爲默認配置文件
位置 | 描述 | 優先級 |
---|---|---|
file:./config/ | 工程項目/config | 高 |
file:./ | 工程項目 | 較高 |
classpath:/config/ | resources/config | 較低 |
classpath:/ | resources | 低 |
-
優先級由高到底,高優先級的配置會覆蓋低優先級的配置;
-
SpringBoot會從這四個位置全部加載主配置文件;互補配置;
2.7 外部配置加載順序
-
SpringBoot也可以從以下位置加載配置; 優先級從高到低;高優先級的配置覆蓋低優先級的配置,所有的配置會形成互補配置
-
命令行參數:所有的配置都可以在命令行上進行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
- 多個配置用空格分開; --配置項=值
-
來自java:comp/env的JNDI屬性
-
Java系統屬性(System.getProperties())
-
操作系統環境變量
-
RandomValuePropertySource配置的random.*屬性值
-
由jar包外向jar包內進行尋找;
優先加載帶profile
6.jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
7.jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
再來加載不帶profile
8.jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
9.jar包內部的application.properties或application.yml(不帶spring.profile)配置文件
10.@Configuration註解類上的@PropertySource
11.通過SpringApplication.setDefaultProperties指定的默認屬性
所有支持的配置加載來源;