SpringBoot之旅第二篇-配置

1、引言

雖然springboot幫咱們進行了自動配置,但配置仍是不可避免的,好比最簡單的端口號,數據庫鏈接。但springboot的配置通常不用xml進行配置,而是yml和properties,選擇他們固然是由於他們更方便。java

YAML(YAML Ain't Markup Language)是以數據爲中心的,因此比xml和json更適合作配置文件,咱們看一個簡單例子:配端口號spring

yaml的寫法是:數據庫

server:
  port: 8089

xml的寫法是:json

<server>
    <port>8081</port>
</server>

直觀上咱們就能看到yaml的寫法更簡練,xml用了很大的空間放在標籤的開閉上,而yaml不須要,下面咱們來細講yaml的語法。數組

 

2、YAML語法

yaml的基本語法是 k:(空格)v:表示一對鍵值對(空格必須有),以空格的縮進來控制層級關係,只要是左對齊的一列數據,都是同一個層級的。且屬性和值都是大小寫敏感的。如:springboot

server:
  port: 8081
  path: /hello

咱們重點看看值的寫法,值的寫法是指能夠用哪些寫法來寫值,通常有:字面量,對象、Map,數組app

字面量:就是指普通的值(數字,字符串,布爾),這個寫法就是直接k: v:方式,字符串默認不用加上單引號或者雙引號,若是加了,那雙引號和單引號是有區別的,區別在因而不是轉義特殊字符,雙引號會轉義特殊字符,而單引號不會。如:測試

name: "yuanqinnan \n yuanyuan" 輸出;yuanqinnan 換行  yuanyuan
name: ‘yuanqinnan \n yuanyuan’:輸出;yuanqinnan \n  yuanyuan

對象、Map的寫法也是普通的k: v 寫法,在下一行來寫對象的屬性和值的關係。如spa

friends:
  lastName: zhangsan
  age: 20

也能夠一行完成.net

friends: {lastName: zhangsan,age: 18}

數組(List、Set)

用- 值表示數組中的一個元素,如:

pets:
 - cat
 - dog
 - pig

記得- 後要打空格,這也有一行寫法:

pets: [cat,dog,pig]

 

3、配置文件注入

配置文件寫完,那麼咱們就要來使用了,下面講配置文件值注入。

第一種方式@ConfigurationProperties

新建一個person類

/**
 * 將配置文件中配置的每個屬性的值,映射到這個組件中
 * @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 ,@Value支持字面量,${key}從環境變量、配置文件中獲取值,支持#{Spel}表達式,怎麼寫呢?例子:

//支持${}
@Value("${person.lastName}")
private String lastName;
//支持#{SpEL}
@Value("#{10*2}")
private Integer age;
//支持字面量
@Value("true")

二者有如下的區別:

@ConfigurationProperties默認從主配置文件中獲取值,若是須要專門的配置文件則須要使用@PropertySource ,寫法以下:

@PropertySource(value = {"XXX"})

咱們應該怎麼選擇兩種注入方式呢?

若是說,咱們只是在某個業務邏輯中須要獲取一下配置文件中的某項值,使用@Value。

若是說,咱們專門編寫了一個javaBean來和配置文件進行映射,咱們就直接使用@ConfigurationProperties。

這裏還要注意Spring Boot裏面沒有Spring的配置文件,咱們本身編寫的配置文件,不能自動識別,什麼意思呢?

如咱們新建一個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.yuanqinnan.service.HelloService"></bean>
</beans>

 

按照路徑添加HelloService類,而後咱們直接去獲取bean,看看能不能取出來

測試方法:

@Autowired
ApplicationContext ioc;
@Test
public void beanTest(){
    boolean b = ioc.containsBean("helloService");
    System.out.println(b);
}

 

結果是false,說明沒有注入成功,這個時候咱們須要使用@ImportResource在啓動類上加上

@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。

 

4、多個文件

在實際開發中,咱們可能會有多個配置文件,好比本地的配置,測試的配置,正式的配置,這個時候咱們就可使用,通常咱們會命名爲: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的默認配置文件,並按照如下順序進行掃描:

一、根目錄下:./config/

二、根目錄下:./

三、類路徑下:/config/

四、類路徑下classpath:/

優先級由高到底,若是後面的文件有相同配置則不起做用,這些配置文件都是互補配置,咱們能夠將須要的配置文件分類進行寫入。

spingboot有不少自動配置類,而且爲這些自動配置類提供了默認的properties,如數據庫鏈接配置。

咱們根據這個properties,再進行相應的屬性配置:

 

5、總結

SpringBoot啓動會加載大量的自動配置類,咱們看咱們須要的功能有沒有SpringBoot默認寫好的自動配置類,咱們再來看這個自動配置類中到底配置了哪些組件,(只要咱們要用的組件有,咱們就不須要再來配置了)給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。咱們就能夠在配置文件中指定這些屬性的值。

相關文章
相關標籤/搜索