带着你读源码,了解Springboot启动原理(一)

1、根据main方法的SpringApplication.run方法的调用,一直跟踪定位到它的双参构造方法

在这里插入图片描述

2、代码行:this.webApplicationType = WebApplicationType.deduceFromClasspath(); 作用分析

2.1 跟进去发现调用的是枚举类WebApplicationType中的deduceFromClasspath方法,此方法中使用ClassUtils.isPresent判断类路径中是否存在对应的类

在这里插入图片描述

2.2 检查指定类名的类是否可以在给定的 ClassLoader 中加载(在运行时检查类是否存在且可加载,从而避免了直接尝试加载类时可能引发的异常)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、代码行:this.bootstrapRegistryInitializers = getBootstrapRegistryInitializersFromSpringFactories();作用分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图方法中的,classLoader.getResoures(“META-INF/spring.factories”)的调用,告诉我们,我们可以使用类加载器来加载我们需要的文件,像下面这样来(伪代码):

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

Enumeration<URL> urls = classLoader.getResources(文件路径);

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()) {

    }
}

在这里插入图片描述
纠正:上图中cache应该是ConcurrentReferenceHashMap类型,截图有误。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、代码行:setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); 作用,类似代码行3,将ApplicationContextInitializer类型(子类),调用无参构造生成对象

5、代码行:setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); 作用分析,类似代码行3,将ApplicationListener类型(子类),调用无参构造生成对象

6、代码行:this.mainApplicationClass = deduceMainApplicationClass(); 作用分析

推断并返回包含 main 方法的主应用程序类(Main Application Class)。这是 Spring Boot 框架中常见的一个工具方法,用于自动检测启动类。

在这里插入图片描述
在这里插入图片描述
关键的run方法,请继续关注后续文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值