springboot之旅第二篇-配置
一、引言
雖然springboot幫我們進行了自動配置,但配置還是不可避免的,比如最簡單的端口號,數據庫連接。但springboot的配置一般不用xml進行配置,而是yml和properties,選擇他們當然是因為他們更方便。
server: port: 8089
xml的寫法是:
<server> <port>8081</port> </server>
直觀上我們就能看到yaml的寫法更簡練,xml用了很大的空間放在標簽的開閉上,而yaml不需要,下面我們來細講yaml的語法。
二、
server:
port: 8081
path: /hello
我們重點看看值的寫法,值的寫法是指可以用哪些寫法來寫值,一般有:字面量,對象、Map,數組。
字面量:就是指普通的值(數字,字符串,布爾),這個寫法就是直接k: v:方式,字符串默認不用加上單引號或者雙引號,如果加了,那雙引號和單引號是有區別的,區別在於是不是轉義特殊字符,雙引號會轉義特殊字符,而單引號不會。如:
name: "yuanqinnan \n yuanyuan" 輸出;yuanqinnan 換行 yuanyuan
name: ‘yuanqinnan \n yuanyuan’:輸出;yuanqinnan \n yuanyuan
friends:
lastName: zhangsan
age: 20
也可以一行完成
friends: {lastName: zhangsan,age: 18}
數組(List、Set)
用- 值表示數組中的一個元素,如:
pets:
- cat
- dog
- pig
記得- 後要打空格,這也有一行寫法:
pets: [cat,dog,pig]
三、配置文件註入
配置文件寫完,那麽我們就要來使用了,下面講配置文件值註入。
第一種方式@ConfigurationProperties
/** * 將配置文件中配置的每一個屬性的值,映射到這個組件中 * @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定; * prefix = "person":配置文件中哪個下面的所有屬性進行一一映射 * * 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能; * */ @Component @ConfigurationProperties(prefix = "person") @Data 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; }
這裏為了少些一些代碼,引入lombok,增加依賴,這個不清楚的同學自行百度了。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> </dependency>
再建一個dog類:
@Data public class Dog { private String name; private Integer age; }
然後在配置文件中加入以下配置:
server:
port: 8089
person:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 12
這裏基本包含了我們需要的各種類型,直接在SpringbootLearnApplicationTests測試:
測試結果:
除了可以一次性註入之外,還有
//支持${} @Value("${person.lastName}") private String lastName; //支持#{SpEL} @Value("#{10*2}") private Integer age; //支持字面量 @Value("true")
兩者有以下的區別:
@PropertySource(value = {"XXX"})
我們應該怎麽選擇兩種註入方式呢?
如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value。
如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties。
這裏還要註意Spring Boot裏面沒有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.yuanqinnan.service.HelloService"></bean> </beans>
按照路徑添加HelloService類,然後我們直接去獲取bean,看看能不能取出來
測試方法:
@Autowired ApplicationContext ioc; @Test public void beanTest(){ boolean b = ioc.containsBean("helloService"); System.out.println(b); }
@ImportResource(locations = {"classpath:beans.xml"})
這樣才能註入進來,因為springboot是不推薦使用xml文件而使用註解方式,我們一般這麽寫
@Configuration public class MyAppConfig { //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名 @Bean public HelloService helloService2(){ System.out.println("配置類@Bean給容器中添加組件了..."); return new HelloService(); } }
這樣helloService2就註入進來了
@Test public void beanTest2(){ boolean b = ioc.containsBean("helloService2"); System.out.println(b); }
測試結果為true。
四、多個文件
在實際開發中,我們可能會有多個配置文件,比如本地的配置,測試的配置,正式的配置,這個時候我們就可以使用,一般我們會命名為:application-{profile}.properties/yml,那我們新建2個配置文件:
然後在application.yml加上
spring:
profiles:
active: dev
這樣我們可以方便的切換環境配置,那上線的時候我們想改動配置文件怎麽辦呢?帶參數命令就可以實現
java -jar springboot-learn-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
我們可以用多個文件來進行配置,那麽就會有優先級的問題,springboot是怎麽做的呢?
springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認配置文件,並按照以下順序進行掃描:
1、根目錄下:./config/
2、根目錄下:./
3、類路徑下:/config/
4、類路徑下classpath:/
優先級由高到底,如果後面的文件有相同配置則不起作用,這些配置文件都是互補配置,我們可以將需要的配置文件分類進行寫入。
spingboot有很多自動配置類,並且為這些自動配置類提供了默認的properties,如數據庫連接配置。
我們根據這個properties,再進行相應的屬性配置:
五、總結
SpringBoot啟動會加載大量的自動配置類,我們看我們需要的功能有沒有SpringBoot默認寫好的自動配置類,我們再來看這個自動配置類中到底配置了哪些組件,(只要我們要用的組件有,我們就不需要再來配置了)給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。我們就可以在配置文件中指定這些屬性的值。
springboot之旅第二篇-配置