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指定的值,并将这些值作为自动配置类导入容器中,自动配置类就会生效,最后完成自动配置工作,如下图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值