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方法,请继续关注后续文章