Spring Boot自動配置知識點分析

一、配置文件分析

Spring boot使用一個全局的配置文件(配置文件名是固定的):

  • application.properties
  • application.yml

配置文件放在src/mian/resource目錄貨或者類路徑下的/config下。

.yml是YAML語言的文件,以數據爲中心,比json、xml等更適合做配置文件,具體參考:http://www.yaml.org(參考語法規範)。

1、yml配置

server:
  port: 8081
  path:/hello

k:(空格)v:標識一對鍵值對(空格必須有)
以空格的縮進來控制層級關係;只要是左對齊的一列數據,都是同一個層級的
屬性和值也是大小寫敏感的

2、properties配置

user.name=test
user.age=18

3、怎麼將配置文件中值,映射到我們組件中

(1)、@ConfigurationProperties:通過這個註解進行綁定

實例:

/**
 * 將配置文件中配置的每個屬性的值,映射到這個組件中
 * @ConfigurationProperties: 告訴Spring Boot將本類中的所有屬性和配置文件中相關的配置進行綁定
 * prefix = "user":配置文件中哪個下面的所有屬性一一映射,默認從全局配置文件中去取
 *
 * 生效條件:只有這個組件是容器中的組件,才能用容器中的這個@ConfigurationProperties功能
 */
@ConfigurationProperties(prefix = "user")
public class User {

    private Integer id;

    private String name;

    private Integer age;
}
user:
  name: test
  age: 18

擴展:我們可以導入配置文件處理器,以後編寫配置就有提示了:

<!--導入配置文件處理器,有了這個我們的配置文件中自定義的屬性就有綁定就有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

(2)、通過@Value註解進行賦值

 @Value("user.name")
    private String name;

(3)、@ConfigurationProperties與@Value的區別

(4)、可以通過@PropertySource導入指定文件的配置,如下:

@PropertySource(value = {"classpath:user.properties"})
@ConfigurationProperties(prefix = "user")
public class User {

    private Integer id;

    @Value("user.name")
    private String name;

    private Integer age;
}

(5)、@ImportResource

spring boot推薦使用@Bean的方式進行註冊。

4、Profile多環境支持

(1)、通過spring.profiles.active=dev配置進行環境切換

實例:

這個裏面有兩個環境,通過在application.properties文件中增加spring.profiles.active=dev進行切換。

(2)、可以通過啓動jar的時候,通過命令行參數進行指定環境切換

(3)、通過虛擬機參數進行環境指定-DSpring.profiles.active=dev

二、配置的加載順序

還可以通過外部進行加載配置:

加載配置是由外到內

二、自動配置的原理

Spring boot啓動的時候加載主配置類,開啓了自動配置功能@EnableAutoConfiguration

@EnableAutoConfiguration的作用分析:

跟蹤到註解裏面:

@Import(EnableAutoConfigurationImportSelector.class)
public @interface 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的值加入到容器中。

每個圖中的***AutoConfiguration類都是容器中的一個組件,都加入到了容器中,用他們來做自動配置。

2、自動配置案例分析

HttpEncodingAutoConfiguration解析自動配置原理

@Configuration(proxyBeanMethods = false) 
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {



@Configuration:這個就是我們spring中的配置類,聲明這個類是一個配置類。

@EnableConfigurationProperties:啓用指定類的ConfigurationProperties功能

ConfigurationProperties功能將配置文件中對應的值和HttpProperties類綁定起來。

/************HttpProperties.class類的內容******************/
@ConfigurationProperties(prefix = "spring.http") //從配置文件中獲取指定值和bean的屬性進行綁定
public class HttpProperties {


/**************@ConditionalOnWebApplication*******************/
這個是Spring底層的@Conditional註解,根據不同的條件,
如果滿足指定的條件,整個配置類裏面的配置就會生效,  
這個註解裏面它會去spring的整個容器中去找相關的組件,
如果存在就加載進來,比如有AOP的組件,找到了,就給加載進來。

從以上分析得:

所有在配置文件中能配置的屬性都在***Properties類中封裝着,所以配置文件能配置什麼就可以參照某個功能對應的這個屬性類。

 

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