后面还有springboot的自动装配的过程,上链接:https://blog.csdn.net/wang121213145/article/details/123879652
springboot项目启动的本质,springboot项目run方法底层原理
今天刚做完核酸闲的无聊还是拔一下源码解解乏
springboot启动首先执行的就是run方法,直接上源码:
——>run——>run
初始化SpringApplication
发现这里初始化了一个SpringApplication,点进去看一下嘛咱们:
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
// 1、资源初始化资源加载器为 null
this.resourceLoader = resourceLoader;
// 2、断言主要加载资源类不能为 null,否则报错
Assert.notNull(primarySources, "PrimarySources must not be null");
// 3、初始化主要加载资源类集合并去重
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
// 4、推断当前 WEB 应用类型
this.webApplicationType = deduceWebApplicationType();
// 5、设置应用上线文初始化器
setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class));
// 6、设置监听器
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
// 7、推断主入口应用类
this.mainApplicationClass = deduceMainApplicationClass();
}
重点看下下面两个方法:
this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
可以看出来大概意思就是初始化和监听,这两个方法还是挺重要的,涉及到spring.factories文件的加载
进入getSpringFactoriesInstances方法看下:
在这里面获取到一个类加载器,下面有一个loadFactoryNames方法
熟悉嘛,这个方法在研究springboot自动装配原理的时候@SpringbootApplication注解的时候里面有提及,我们再来看下这个方法
加载spring-boot-autoconfigure-2.0.3.RELEASE.jar!/META-INF/spring.factories这个配置文件,并且由 cache.put(classLoader, result);看出来是添加到缓存中的,方便下次的读取,就不需要再去读取配置文件了。
之后继续往下看this.deduceMainApplicationClass();
通过异常函数来找到main函数,然后找到对应的启动类并返回,这就是整个初始化的过程。嘶~
接下来就是run方法
Run方法深究
run方法里面才是重中之重,不要着急,下面一行一行来分析:
!!!!!!!!一行一行:
start()方法
start()方法就是一个时间统计的问题,记录下我们运行的时间。不用深究
往下走:
这是一个获取监听器的操作并进行监听,哎?忽然想到刚才初始化的时候不就有一个监听器,
正解。就是获取初始化的监听器
这也是一个观察者模式,不懂得可以下去看下。
接续走: >DefaultApplicationArguments(args);
封装参数,不多说,接着走~
prepareEnvironment
在springboot应用程序里面中有一个很重要的接口对象Environment
Environment——>实现类StandardEnvironment
这里加载当前系统的变量以及当前系统的一些属性值,像是系统变量系统名字以及编码格式等等好多东西
接着走~
printBanner这个就是控制台打印的横幅,就是这个↓
这个总明白吧
走~
创建上下文对象,往下异常赋值
简化:
重点方法来了:
this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
快进去进去直接列出来:
load()——>load()往下
this.isComponent(source)为判断加载类上面的注解是否是Component注解
然后接着
this.annotatedReader.register(new Class[]{source});
将启动类放进来,这里并不会完成注解的解析,只是把启动类做了一个基本的标识,方便后面调用。
然后返回返回返回
总的来说就是:识别到启动类,方便后面启动类的注解解析
走~
refreshContext
refreshContext熟悉了吧,IOC的底层,总来说就是通过IOC创建Bean对象,初始化操作。也可以理解为IOC的初始化。不懂得可以看看IOC底层哦~
这是springboot项目启动的本质,后面自动装配的原理看我的另一篇文章哦~
https://blog.csdn.net/wang121213145/article/details/123879652?spm=1001.2014.3001.5501