spring學(xué)習(xí)筆記2|從源碼看springboot如何實(shí)現(xiàn)自動配置
搭建一個ssm框架需要開發(fā)者手動進(jìn)行大量配置,springboot的核心就是【自動配置】,使開發(fā)者專注于業(yè)務(wù)層。
springboot接管了:
DispatcherServlet配置
view層配置
自動導(dǎo)入依賴
【pom.xml】里有:
啟動器:使自動配置生效
spring-boot-starter開頭的
spring-boot-starter-web:web環(huán)境所有依賴。如實(shí)現(xiàn)http接口(已包含spirngmvc),容器默認(rèn)為tomcat
spring-boot-starter-test:單元測試
build:支持打包成接口在target中
【啟動類】里有:
@SpringbootApplication:導(dǎo)入啟動類下的所有資源
????????@ComponentScan:掃描主啟動類同級的包,【所以建包一定要與該類同級】
????????@SpringBootConfiguration:支持springboot的配置
????????????????@Configuration:標(biāo)記為配置類
????????????????@Component:標(biāo)記為組件
????????@EnableAutoConfiguration:支持自動配置。
????????????????@AutoConfigurationPackage:自動配置包
????????????????????????????????AutoConfigurationPackages.Registrar.class,自動將導(dǎo)入的包注冊
????????????????@Import({AutoConfigurationImportSelector.class}):導(dǎo)入自動配置選擇器,選擇????????????????????????啟動類要用的配置導(dǎo)入,AutoConfigurationImportSelector.class里有:
????????????????????List<String> configurations =
this.getCandidateConfigurations(annotationMetadata, attributes),獲取了所有配置。
getCandidateConfigurations方法里有一個load方法,加載了META-INF/spring/%s.imports”里的自動配置類,注意,這是一大堆是所有的自動配置類,包括此工程用不上的
它們的@ConditionalOnxxx注解能識別哪些是需要的,以類名形式返回,添加到容器,這些類標(biāo)記為bean。
getCandidateConfigurations方法下面還有一個空判斷:
"No auto configuration classes found in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.”告訴開發(fā)者你要的配置類真找不到了,換個版本吧
找到META-INF/spring.factories,第四項(xiàng)# Auto Configuration Import Filters就是springboot幫我們導(dǎo)入的、用得上的自動配置類。只要我們pom.xml導(dǎo)入了對應(yīng)啟動器,就會配置成功。
綜上,springboot在啟動時掃描AutoConfiguration.imports. 根據(jù)@ConditionalOnxxx注解能識別哪些是需要的,加載到spring.factories,完成了自動配置。
?ps:我的springboot版本是3.0.5,老一點(diǎn)的版本貌似將所有配置類也放在spring.factories中,但仍通過@ConditionalOnxxx判斷。不太會看源碼,歡迎大佬指正。