springboot源碼自動裝配解析學習(標題一)

只爲記錄自己學習的知識總結分享,歡迎指正,共同學習提升。
廢話不多上圖:

創建一個Demo,進入到springboot主方法:
在這裏插入圖片描述在這裏插入圖片描述

進入到@EnableAutoConfiguration利用@Import 註解將所有符合自動裝配的Bean注入到IOC容器中
在這裏插入圖片描述

進入到AutoConfigurationImportSelector 類,第一句判斷當前的系統是否禁用了自動裝配的功能,如果被禁用:private static final String[] NO_IMPORTS = {}; 返回一個空的數組,後續也就無法注入Bean了;SpringBoot通過該方法選擇性導入啓動時需要的組件;
在這裏插入圖片描述

進入getAutoConfigurationEntry()方法,我們主要關注116行;會給容器注入衆多的配置類,給容器導入這個場景需要的所有組件,並配置好這些組件;獲取候選配置選擇性加載,並返回AutoConfigurationEntry
在這裏插入圖片描述

我們點擊進去看進入到以下方法:
候選配置類獲取方法
在這裏插入圖片描述

再進入loadFactoryNames()方法
public static List loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
    MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
    if (result != null) {
        return result;
    } else {
        try {
            //從類路徑的META-INF/spring.factories中加載所有默認的自動配置類
            Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
            LinkedMultiValueMap result = new LinkedMultiValueMap();

            while(urls.hasMoreElements()) {
                URL url = (URL)urls.nextElement();
                UrlResource resource = new UrlResource(url);
                Properties properties = PropertiesLoaderUtils.loadProperties(resource);
                Iterator var6 = properties.entrySet().iterator();

                while(var6.hasNext()) {
                    Entry<?, ?> entry = (Entry)var6.next();
                    //獲取EnableAutoConfiguration指定的所有值,也就是EnableAutoConfiguration.class的值
                    String factoryTypeName = ((String)entry.getKey()).trim();
                    String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
                    int var10 = var9.length;

                    for(int var11 = 0; var11 < var10; ++var11) {
                        String factoryImplementationName = var9[var11];
                        result.add(factoryTypeName, factoryImplementationName.trim());
                    }
                }
            }

            cache.put(classLoader, result);
            return result;
        } catch (IOException var13) {
            throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);
        }
    }
}

Springboot啓動時會從類路徑下的META-INF/spring.factories中獲取到EnableAutoConfiguration指定的值,並將這些值作爲自動配置類導入容器中,自動配置類就會生效,最後完成自動配置工作,如下圖

在這裏插入圖片描述

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