SpringBoot源码学习 SpringApplication对象

SpringBoot源码学习 SpringApplication对象,第1张

SpringBoot源码学习 SpringApplication对象

首先关注的是启动类

 在该方法上打上断点调试接下来执行的过程

点击进入run方法中加载源文件   就是这个主启动类

 

继续点进去

 

发现new了一个SpringApplication对象,点进去这个对象发现有一系列的方法 

其中最重要的是这两行代码

setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));

这两行代码主要做的就是    设置初始化,设置监听器 点击进入第一个方法

发现一个重要的方法,loadFactoryNames

 继续走下去

loadSpringFactories方法的功能是从默认的spring.factories文件中加载,这个文件存放的很多类的全限定类名,保存为properties文件,然后读取

    private static Map> loadSpringFactories(ClassLoader classLoader) {
        Map> result = (Map)cache.get(classLoader);
        if (result != null) {
            return result;
        } else {
            HashMap result = new HashMap();

            try {
                Enumeration urls = classLoader.getResources("meta-INF/spring.factories");

                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();
                        String factoryTypeName = ((String)entry.getKey()).trim();
                        String[] factoryImplementationNames = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
                        String[] var10 = factoryImplementationNames;
                        int var11 = factoryImplementationNames.length;

                        for(int var12 = 0; var12 < var11; ++var12) {
                            String factoryImplementationName = var10[var12];
                            ((List)result.computeIfAbsent(factoryTypeName, (key) -> {
                                return new ArrayList();
                            })).add(factoryImplementationName.trim());
                        }
                    }
                }

                result.replaceAll((factoryType, implementations) -> {
                    return (List)implementations.stream().distinct().collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
                });
                cache.put(classLoader, result);
                return result;
            } catch (IOException var14) {
                throw new IllegalArgumentException("Unable to load factories from location [meta-INF/spring.factories]", var14);
            }
        }
    }

 

从springfactory中读取初始化类和监听器,取出了类的全限定类名

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5710223.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存