1. 程式人生 > >SpringBoot專欄:SpringBoot自動配置原理以及細節(第三講)

SpringBoot專欄:SpringBoot自動配置原理以及細節(第三講)

 

自動配置原理

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

2)、@EnableAutoConfiguration 作用: 

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

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

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

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

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

# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ 
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ 
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ 
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ 
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ 
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ 
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\ 
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\ 
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\ 
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\ 
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\ 
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration
, 

每一個這樣的 xxxAutoConfiguration類都是容器中的一個元件,都加入到容器中;用他們來做自動配置;
3)、每一個自動配置類進行自動配置功能; 

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

根據當前不同的條件判斷,決定這個配置類是否生效?
一但這個配置類生效;這個配置類就會給容器中新增各種元件;這些元件的屬性是從對應的properties類中獲取 的,這些類裡面的每一個屬性又是和配置檔案繫結的;
5)、所有在配置檔案中能配置的屬性都是在xxxxProperties類中封裝者‘;配置檔案能配置什麼就可以參照某個功 能對應的這個屬性類

精髓:
 
 1)、SpringBoot啟動會載入大量的自動配置類
  2)、我們看我們需要的功能有沒有SpringBoot預設寫好的自動配置類;
  3)、我們再來看這個自動配置類中到底配置了哪些元件;(只要我們要用的元件有,我們就不需要再來配置了)
 
 4)、給容器中自動配置類新增元件的時候,會從properties類中獲取某些屬性。我們就可以在配置檔案中指定這 些屬性的值;
 
xxxxAutoConfigurartion:自動配置類;
給容器中新增元件
     xxxxProperties:封裝配置檔案中相關屬性;

細節

1、@Conditional派生註解(Spring註解版原生的@Conditional作用) 
作用:必須是@Conditional指定的條件成立,才給容器中新增元件,配置配裡面的所有內容才生效;

自動配置類必須在一定的條件下才能生效;
我們怎麼知道哪些自動配置類生效;
我們可以通過啟用 debug=true屬性;來讓控制檯列印自動配置報告,這樣我們就可以很方便的知道哪些自動配置 類生效;