1. 程式人生 > >詳解springboot配置

詳解springboot配置

1.配置檔案:

當我們構建完Spring Boot專案之後,會在resources目錄下給我們自動生成一個空的配置檔案(application.properties),在springboot的底層已經替我們配置好了很多預設配置,只需要修改這個application.properties檔案就可以更改預設配置。

對於application配置檔案有兩種格式,除了application.properties,還可以寫成application.yml格式,兩種檔案配置原理相同,只是語法不同。

 

2.配置檔案書寫方法:

1)對於數字、字串、布林值的填寫:

   1.直接寫:

  2、雙引號

不會轉義字串裡面的特殊字元,特殊字元會作為本身想表示的意思  

輸出:
zhangsan
lisi

3、單引號

會轉義特殊字元,特殊字元最終只是一個普通的字串資料

輸出:

zhangsan \n lisi

2)map 鍵值對的賦值

1.對於yml格式採用行內寫法:

2.properties:

3)list 以及陣列的形式:

1.yml:

2.properties:

 

 

3.bean屬性的填充。

構建person.properties,  也可以直接線在applicattion.properties裡,對於非全域性配置建議單獨建一個properties(不支援yml)填寫配置

 

@ConfigurationProperties 註解向Spring Boot宣告該類中的所有屬性和配置檔案中相關的配置進行繫結。

  • prefix = "person":宣告配置前戳,將該前戳下的所有屬性進行對映。

@Component 或者@Configuration:將該元件加入Spring Boot容器,只有這個元件是容器中的元件,配置才生效。

package com.wj.springboot.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Author: wj
 * @Date: 2018/12/27 14:10
 * @Version 1.0
 */


/**
 * @ConfiguratuinProerties :明確Springboot將本類中的所有屬性和配置檔案中的配置繫結
 * prefix :制定配置檔案中的哪個屬性為下面的bean進行對映
 *
 * 必須把它加入springioc容器中
 * 必須寫get和set方法
 */
@PropertySource(value = {"classpath:person.properties"})//制定配置檔案位置
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
   // @Value("${person.lastName}")
    private String lastName;
   // @Value("123")
    private Integer age;
    private Boolean boss;
    private Date birth;


    private Map<String,Object> maps;

    private List<Object> lists;

    private Dog dog;


    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }


    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }


    public String getLastName() {
        return lastName;
    }

    public Integer getAge() {
        return age;
    }

    public Boolean getBoss() {
        return boss;
    }

    public Date getBirth() {
        return birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public Dog getDog() {
        return dog;
    }
}

測試:

package com.springboot.test;

import com.springboot.test.Bean.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    private Person person;

	@Test
	public void contextLoads() {
        System.out.println(person);
    }

}

輸出:

 

在配置自定義屬性時,如果想要獲得和配置Spring Boot屬性自動提示一樣的功能,則需要加入下面的依賴:

若是依舊無法自動提示,可以嘗試開啟IDE的Annonation Processing

 

 

4.配置檔案的載入位置:

springboot 啟動會掃描以下位置的application.properties或者application.yml檔案作為Spring boot的預設配置檔案

 

classpath:就是resources.

  • –file:./config/

  • –file:./

  • –classpath:/config/

  • –classpath:/

優先順序由高到底,高優先順序的配置會覆蓋低優先順序的配置;SpringBoot會從這四個位置全部載入主配置檔案。

專案打包好以後,我們可以使用命令列引數的形式,啟動專案的時候來指定配置檔案的新位置;指定配置檔案和預設載入的這些配置檔案共同起作用形成互補配置;

我們還可以通過spring.config.location來改變預設的配置檔案位置,示例:

java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

 

5.springboot的自動配置原理

1、SpringBoot啟動的時候載入主配置類,@EnableAutoConfiguration註解開啟了自動配置功能。

2、@EnableAutoConfiguration 作用:

  • 利用EnableAutoConfigurationImportSelector給容器中匯入一些元件

  • 可以檢視selectImports()方法的內容;

  • List<String> configurations = getCandidateConfigurations(annotationMetadata,  attributes);獲取候選的配置

  • SpringFactoriesLoader.loadFactoryNames()
    掃描所有jar包類路徑下  META-INF/spring.factories
    把掃描到的這些檔案的內容包裝成properties物件
    從properties中獲取到EnableAutoConfiguration.class類(類名)對應的值,然後把他們新增在容器中

將類路徑下  META-INF/spring.factories 裡面配置的所有EnableAutoConfiguration的值加入到了容器中

每一個這樣的  xxxAutoConfiguration類都是容器中的一個元件,都加入到容器中,用他們來做自動配置。

3、對每一個自動配置類進行自動配置功能。

4、以HttpEncodingAutoConfiguration(Http編碼自動配置)為例解釋自動配置原理;

@Configuration   //表示這是一個配置類,以前編寫的配置檔案一樣,也可以給容器中新增元件
@EnableConfigurationProperties(HttpEncodingProperties.class) //啟動指定類的ConfigurationProperties功能;將配置檔案中對應的值和HttpEncodingProperties繫結起來;並把HttpEncodingProperties加入到ioc容器中

@ConditionalOnWebApplication 
//Spring底層@Conditional註解(Spring註解版),根據不同的條件,如果滿足指定的條件,整個配置類裡面的配置就會生效;判斷當前應用是否是web應用,如果是,當前配置類生效

@ConditionalOnClass(CharacterEncodingFilter.class)  
//判斷當前專案有沒有這個類CharacterEncodingFilter;SpringMVC中進行亂碼解決的過濾器;

@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)  
//判斷配置檔案中是否存在某個配置  spring.http.encoding.enabled;如果不存在,判斷也是成立的
//即使我們配置檔案中不配置pring.http.encoding.enabled=true,也是預設生效的;
public class HttpEncodingAutoConfiguration {

      //他已經和SpringBoot的配置檔案映射了
      private final HttpEncodingProperties properties;

   //只有一個有參構造器的情況下,引數的值就會從容器中拿
      public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
        this.properties = properties;
    }

    @Bean   //給容器中新增一個元件,這個元件的某些值需要從properties中獲取
    @ConditionalOnMissingBean(CharacterEncodingFilter.class) //判斷容器沒有這個元件
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
        return filter;
    }

根據當前不同的條件判斷,決定這個配置類是否生效。

一但這個配置類生效,這個配置類就會給容器中新增各種元件,這些元件的屬性是從對應的properties類中獲取的,這些類裡面的每一個屬性又是和配置檔案繫結的。

5、所有在配置檔案中能配置的屬性都是在xxxxProperties類中封裝者,配置檔案能配置什麼就可以參照某個功能對應的這個屬性類

@ConfigurationProperties(prefix = "spring.http.encoding")  //從配置檔案中獲取指定的值和bean的屬性進行繫結
public class HttpEncodingProperties {

   public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

精髓:

1) SpringBoot啟動會載入大量的自動配置類

2) 先看我們需要的功能有沒有SpringBoot預設寫好的自動配置類

3) 再來看這個自動配置類中到底配置了哪些元件(只要我們要用的元件有,我們就不需要再來配置了)

4) 給容器中自動配置類新增元件的時候,會從properties類中獲取某些屬性。我們就可以在配置檔案中指定這些屬性的值

xxxxAutoConfigurartion:自動配置類;給容器中新增元件;

xxxxProperties:封裝配置檔案中相關屬性;

 

 

注:

@Conditional註解

@Conditional派生註解(Spring註解版原生的@Conditional作用)

作用:必須是@Conditional指定的條件成立,才給容器中新增元件,配置配裡面的所有內容才生效。