Spring-boot入門之配置詳解
1.配置檔案
spring-boot
預設有兩種配置檔案
- appliation.properties
- appliation.yml
配置檔案預設放在src/main/resources
目錄或者是類路徑/config
下
配置檔案的作用:修改spring-boot自動配置的預設值
2.YAML
.yml
即YAML
YAML Ain’t Markup Language
傳統的java專案中,多使用xml檔案,而YAML檔案以資料為中心,比json、xml更加適合做配置檔案,更加簡潔
- YAML配置範例
server :
port: 7900
- xml配置範例
<server>
<port>7900</port>
</server>
對比之下,我們可以看到,使用YAML要更加的簡潔方便
3.YAML語法
- 基本語法
k:(空格)V
表示一對鍵值對(空格必須要有)
以空格的縮排來控制層級關係,只要左對齊的一列資料都是同一層級的
server:
port: 8080
path: /api
上述程式碼中,port和path為同一層級的
屬性和值嚴格區分大小寫
- 值的寫法
字面量: 普通的值(數字、字串、布林)
k: v
字面量直接來寫
字串預設不加上單引號或雙引號
雙引號不會轉義字串裡面的特殊字元,特殊字元會作為本身想要表示的意思
如 name: "zhagnsan \n lisi" 結果:zhangsan 換行 lisi
單引號會轉義字串裡的特殊字元,特殊字元最終只是一個普通的字串資料
如 name: 'zhagnsan \n lisi' 結果:zhangsan \n lisi
物件、Map(屬性和值、鍵值對)
k: v 在下一行來寫物件的屬性和值得關係,只需要注意縮排即可
user:
name: zhangsan
age: 20
行內寫法
user: {name: zhangsan,age: 20}
陣列
用-
值表示陣列中的一個元素
pets:
- cat
- dog
- pig
行內寫法
pets: [cat,dog,pig]
4.spring-boot中使用yml
- 新增依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 編寫兩個類
@Component
@ConfigurationProperties(prefix="user")
public class User {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
//getter 和setter
}
public class Dog {
private String name;
private Integer age;
//getter 和 setter
}
- 檔案中配置資訊
user:
lastName: zhangsan
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- hello
- zhaoliu
dog:
name: kitty
age: 1
@ConfigurationProperties 告訴spring-boot將本類中的所有屬性和配置檔案中的相關配置進行繫結
prefix=”user” 配置檔案中哪個下面的屬性進行一一對映
只有容器中的類,spring-boot才會繫結配置檔案中的資訊,所以要使用 @Component 生命其實一個spring 的bean
- 測試
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private User user;
@Test
public void contextLoads() {
System.out.println(user);
}
}
執行單元測試,執行結果中發現,配置檔案中的資訊已經繫結到了User
的屬性中
5.spring-boot中使用properties檔案配置資訊
user.last-name=張三
user.age=18
user.boss=false
user.maps.k1=v1
user.maps.k2=v2
user.lists=lisi,hello,zhaoliu
user.dog.name=kitty
user.dog.age=1
類中的資訊不用任何修改,但是對於配置檔案中的中文,會有亂按問題,在不同的IDE中,要使用不同的方式進行調整
[email protected]和@Value使用對比
@ConfigurationProperties支援批量繫結,@Value只能單個繫結
@ConfigurationProperties支援鬆散繫結(駝峰命名),@Value不支援鬆散繫結
@ConfigurationProperties不支援SpEL,@Value支援SpEL
@ConfigurationProperties只是JSR303資料校驗,@Value不支援JSR303
@ConfigurationProperties 支援複雜型別,@Value不支援複雜型別
[email protected]和@ImportResource
@PropertySource 用於載入指定的properties配置檔案
@ImportResource 匯入spring的配置檔案,使配置檔案中的內容生效
@ImportResource("classpath:beans.xml")
[email protected]和@Bean
spring-boot推薦使用全註解的方式向容器中新增元件 @Bean
,就是自己宣告一個配置類,用來代替原來的配置檔案。如何能讓spring-boot能夠自動的識別我們自定義的類為一個配置類呢?就需要用到@Configuration
這個註解了
當然僅僅使用@Configuration
這一個註解是不夠的,還需要與@Bean
配合使用
@Configuration
public class AppConfig {
@Bean
public User initUser() {
return new User();
}
}
如程式碼所示,spring-boot會將@Configuration
修飾的類中,呼叫@Bean
修飾的方法,將方法的返回值新增到容器中,而容器中這個物件的預設id就是方法名
7.在配置檔案中使用佔位符
user.last-name=hello${random.uuid}
user.dog.name=${user.last-name}-kitty
如程式碼所示,user.last-name
會生成一個隨機的uuid字串,而user.dog.name
中,也會將上面的user.last-name
新增進去
- 對不存在的配置新增預設值
user.dog.name=${user.friend:lisi}-kitty
在配置檔案中,user.friend
並不存在,所在獲取的時候,spring-boot會自動將:
後面的值作為這個屬性的預設值進行處理
如果沒有設定預設值
user.dog.name=${user.friend}-kitty
則會將 ${user.friend}
作為一個普通的字串處理
- 佔位符中的隨機數
${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}