自動(dòng)裝配是SpringBoot中通過(guò)@EnableAutoCinfiguration注解來(lái)開(kāi)啟的,這個(gè)注解的聲明在啟動(dòng)類(lèi)注解@SpringBootApplication內(nèi);
注:
@Enable注解:在Spring3.1就已經(jīng)支持該類(lèi)型注解,主要作用是吧相關(guān)組件的Bean裝配到IOC容器中;@Enable注解是對(duì)JavaConfig的進(jìn)一步完善,為使用S任憑Framework的開(kāi)發(fā)者減少了配置代碼量,降低了使用難度;
如果基于JavaConfig的形式來(lái)完成Bean的加載,則必須使用@Configuration注解及Bean注解;而@Enable本質(zhì)上就是對(duì)著兩個(gè)注解的封裝;
@EnableAutoConfiguration
進(jìn)入該注解可以看到除了@Import為還有一個(gè)@AutoConfigurationPackage(作用見(jiàn)圖),而可以看見(jiàn)Import中引入了一個(gè)AutoConfigurationImportSelector,該AutoConfigurationImportSelector實(shí)現(xiàn)了ImportSelector,他只有一個(gè)selectImports抽象方法,并返回一個(gè)String數(shù)組,在這個(gè)shuzh中可以指定需要裝配到IOC容器的類(lèi);
在selectImports方法中,這個(gè)方法主要有兩個(gè)功能
1.AutoConfigurationMetadataLoader.loadMetadata從META-INF/Spring-autoconfigure-metadata.properties中加載自動(dòng)裝配的條件元數(shù)據(jù)
2.收集所有符合條件的配置類(lèi)AutoConfigurationEntry.getConfigurations(),完成自動(dòng)裝配
需要注意的是在AutoConfigurationImportSelector中不執(zhí)行selectImports()方法,而是通過(guò)ConfigurationClassPostProcessor中的processConfigBeanDefinitions方法來(lái)掃描和注冊(cè)所有配置類(lèi)的Bean,最終還是會(huì)調(diào)用getAutoConfigurationEntry方法獲得所有需要自動(dòng)裝配的類(lèi);
在getAutoConfigurationEntry方法中通過(guò)去重等操作,得到最終需要實(shí)現(xiàn)自動(dòng)裝配的類(lèi);而得到的核心方法是getCandidateConfigurations
在該方法中
使用了SpringFactoriesLoader,它會(huì)掃描classPath下的META-INF/Spring.factories文件;根據(jù)配置文件中的key得到value值