在這個註解中,最重要的是它導入了一個類EnableAutoConfigurationImportSelectorspring
它是一個ImportSelector接口的實現類,而ImportSelector接口中的selectImports方法所返回的類將數組
被Spring容器管理起來。ide
再看AutoConfigurationImportSelector類,它不光實現了ImportSelector接口,還實現了不少其它的Aware接口,分別表示在某個時機會被回調,咱們看一下Aware接口就知道了。spa
咱們能夠知道,全部的aware都優先於selectImports方法執行,也就是說selectImports方法最後執行,那麼在它執行的時候全部須要的資源都已經獲取到了(就是那四個成員變量)orm
那咱們看看selectImports都幹了什麼blog
看圖說話:排序
一、加載META-INF/spring-autoconfigure-metadata.properties文件接口
二、獲取註解的屬性及其值(PS:註解指的是@EnableAutoConfiguration註解)資源
三、在classpath下全部的META-INF/spring.factories文件中查找org.springframework.boot.autoconfigure.EnableAutoConfiguration的值,並將其封裝到一個List中返回get
四、對上一步返回的List中的元素去重、排序
五、依據第2步中獲取的屬性值排除一些特定的類
六、對上一步中所獲得的List進行過濾,過濾的依據是條件匹配。這裏用到的過濾器是org.springframework.boot.autoconfigure.condition.OnClassCondition最終返回的是一個ConditionOutcome[]數組。(PS:不少類都是依賴於其它的類的,當有某個類時纔會裝配,因此此次過濾的就是根據是否有某個class進而決定是否裝配的。這些類所依賴的類都寫在META-INF/spring-autoconfigure-metadata.properties文件裏)