講講springboot自動配置原理

講講springboot自動配置原理

講講springboot自動配置原理

file

上圖是springboot自動配置大致流程圖,我們都知道springboot框架使用起來非常方便,我們只要引入相關組件的maven包,然後配置少量的配置就可以正常使用了,不用像以前那樣配置繁雜的xml配置文件。

自動配置jar包

file

 

這個是springboot自動配置的核心jar包,裏面包含了所有的組件自動配置類,例如:RedisAutoConfiguration.java、WebMvcAutoConfiguration.java等一百多個自動配置類。

自動配置原理流程

問題:

  1. 從上面的自動配置jar包裏面,我們知道springboot已經提前這些組件準備好相關的配置自動配置類,但是接下來springboot是怎麼知道需要引入那些配置類呢?

  2. 這些自動配置類是如何被加載到項目中的?

加載自動配置類

首先我們來看下它是如何將這些配置類找到並加載的,我們從啓動類的@SpringBootApplication開始,點進去後我們可以看到@EnableAutoConfiguration,這個@EnableAutoConfiguration註解就是開啓自動配置的。接下來再點進去,如下圖:

 

file

 

我們主要關注這個@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方法:

file

 

源碼裏面的方法比較複雜,我們只要知道它同樣是返回了一個字符串數組,而這些字符串就是這些我們需要加載的自動配置類。它是怎麼得到這些配置類呢,它其實是加載了spring-boot-autoconfigure.jar包下面的spring.factories文件

file

這個文件裏面有大量的自動配置類的全限定名,內容如下圖:

file

 

 

現在我們得到了所有的自動配置類,但是我們不可能所有的都加載進IOC容器吧,所以還得根據我們引入的jar進行過濾,只加載我們需要的自動配置類。

過濾不需要的自動配置類

file

我們以這個RedisAutoConfiguration.java自動配置類爲例,如上圖,可以看到有個@ConditionalOnClass註解,這個註解的作用是當我們的項目環境下有某個類纔會進行加載此bean,就是說如果我們沒有引入redis的maven包,就不會存在RedisOperations這個類,所以此自動配置類就會被過濾掉,最後我們就得到所需要的配置類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章