前言
我們早期在做Spring項目的時候,需要手動添加很多xml配置,比如整合SpringMVC的配置,開啟事務,整合MyBatis等等。這些都需要我們手動編寫大量的配置,簡直就是配置地獄。
Spring官方也發現了這一個痛點,后面SpringBoot橫空出世,解決了這一痛點。SpringBoot基于約定大于配置的理念,根據我們在依賴中的starter,自動的為我們把一些必要的組件裝配到IOC容器中,并且這些組件在SpringBoot中基本上都有默認的配置,所以SpringBoot項目在啟動的時候才可以為我們自動裝配組件。
舉個例子:比如我們要在項目中引入redis相關的組件,我們只需要在項目中加入一個Redis相關的starter即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
只需要引入這個依賴,我們在項目中就可以使用RedisTemplate 來操作Redis了,不用做任何配置。
因為SpringBoot會默認連接 127.0.0.1:6379 這個服務,當然前提是我們本機啟動了Redis服務。這個就是SpringBoot的默認配置,也就是約定。
一、SpringBoot自動裝配過程解析
1.1源碼分析
SpringBoot項目的啟動類上都會有@SpringBootApplication注解,這個注解是一個復合注解。
重點是@EnableAutoConfiguration這個注解,這個注解也是一個復合注解。
@EnableAutoConfiguration注解導入AutoConfigurationImportSelector類,這個類中有一個selectImports()方法。
selectImports(),方法調用了getAutoConfigurationEntry()方法,這個方法里面又有一個關鍵的方法getCandidateConfigurations()。
getCandidateConfigurations()方法借助SpringFactoriesLoader.loadFactoryNames()方法,掃描了所有包含META-INF/spring.factories的jar包,這些jar包實際上就是我們引入的starter中的依賴。
在loadFactoryNames()方法中加載spring.factories文件。
1.2Debug驗證
在getCandidateConfigurations()的第一行打上斷點,然后debug模式啟動SpringBoot項目。
我們發現 configurations集合中存儲了許多全類名,這些就是SpringBoot幫我們把依賴中的相關的組件裝配到了IOC容器中。
比如我們項目中添加了注冊中心nacos相關的依賴,可以看到nacos依賴的庫中META-INF文件夾中有spring.factories文件,這個文件中定義了一些必要的組件全類名,SpringBoot根據這些就可以利用JAVA的反射機制為我們創建出這些對象,然后放到IOC容器中。
總結
SpringBoot自動裝配原理:
- @EnableAutoConfiguration注解導入AutoConfigurationImportSelector類。
- selectImports方法調用SpringFactoriesLoader.loadFactoryNames()掃描所有jar下面的對應的META-INF/spring.factories文件.
- 把所有在spring.factories文件中掃描到的全類名進行實例化加載到IOC容器中。
SpringBoot自動裝配說白了就是自動幫我們把第三方的組件裝配到IOC容器,不需要再手動的去寫Bean相關的配置,因為大多數配置SpringBoot已經幫我們約定好了,也就是約定大于配置的理念。