講講springboot自動配置原理
講講springboot自動配置原理
上圖是springboot自動配置大致流程圖,我們都知道springboot框架使用起來非常方便,我們只要引入相關組件的maven包,然後配置少量的配置就可以正常使用了,不用像以前那樣配置繁雜的xml配置文件。
自動配置jar包
這個是springboot自動配置的核心jar包,裏面包含了所有的組件自動配置類,例如:RedisAutoConfiguration.java、WebMvcAutoConfiguration.java等一百多個自動配置類。
自動配置原理流程
問題:
-
從上面的自動配置jar包裏面,我們知道springboot已經提前這些組件準備好相關的配置自動配置類,但是接下來springboot是怎麼知道需要引入那些配置類呢?
-
這些自動配置類是如何被加載到項目中的?
加載自動配置類
首先我們來看下它是如何將這些配置類找到並加載的,我們從啓動類的@SpringBootApplication開始,點進去後我們可以看到@EnableAutoConfiguration,這個@EnableAutoConfiguration註解就是開啓自動配置的。接下來再點進去,如下圖:
我們主要關注這個@Import(AutoConfigurationImportSelector.class)註解
@Import註解
我們在這裏簡單說明下@Import註解的作用,它的作用是將指定的類轉換成spring的bean放入spring的IOC容器裏面,它有以下3種方式創建bean:
1.直接注入:@Import(bean.class)
2.實現 ImportBeanDefinitionRegistrar 接口注入
3.實現 ImportSelector 注入
上面的@Import(AutoConfigurationImportSelector.class)註解就是使用第三種方式實現注入的,爲了方便理解,我舉個第三種方式的小例子:
public class MyImprotSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//bean的全限定名數組,將數組裏面所有的類創建bean,並加入IOC容器
String[] beanName = {"com.jiayuanhui.api.utils.http.HttpUtils"};
return beanName;
}
}
在這個selectImports重寫方法裏面返回類的全限定名數組,spring就會自動將這些類創建成bean放入IOC容器裏面,我們來看下springboot裏面的AutoConfigurationImportSelector類的selectImports方法:
源碼裏面的方法比較複雜,我們只要知道它同樣是返回了一個字符串數組,而這些字符串就是這些我們需要加載的自動配置類。它是怎麼得到這些配置類呢,它其實是加載了spring-boot-autoconfigure.jar包下面的spring.factories文件
這個文件裏面有大量的自動配置類的全限定名,內容如下圖:
現在我們得到了所有的自動配置類,但是我們不可能所有的都加載進IOC容器吧,所以還得根據我們引入的jar進行過濾,只加載我們需要的自動配置類。
過濾不需要的自動配置類
我們以這個RedisAutoConfiguration.java自動配置類爲例,如上圖,可以看到有個@ConditionalOnClass註解,這個註解的作用是當我們的項目環境下有某個類纔會進行加載此bean,就是說如果我們沒有引入redis的maven包,就不會存在RedisOperations這個類,所以此自動配置類就會被過濾掉,最後我們就得到所需要的配置類。