詳解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指定的條件成立,纔給容器中添加組件,配置配裏面的所有內容才生效。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章