博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot(1.5.6.RELEASE)源码解析(二)
阅读量:6704 次
发布时间:2019-06-25

本文共 3204 字,大约阅读时间需要 10 分钟。

请尊重作者劳动成果,转载请标明原文链接:

上一篇分析了@SpringBootApplication注解,接下来从SpringApplication.run(Application.class, args);代码开始一行行DEBUG进行分析

1 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})2 public class Application {3     public static void main(String[] args) {4         SpringApplication.run(Application.class, args);5     }6 }
1 public static ConfigurableApplicationContext run(Object source, String... args) {2     return run(new Object[] { source }, args);3 }
1 public static ConfigurableApplicationContext run(Object[] sources, String[] args) {2     return new SpringApplication(sources).run(args);3 }

最终会创建一个SpringApplication的对象,然后调用它的run方法

1 public SpringApplication(Object... sources) {2     initialize(sources);3 }

SpringApplication的构造函数会调用initialize方法进行初始化

1 @SuppressWarnings({ "unchecked", "rawtypes" }) 2 private void initialize(Object[] sources) { 3     if (sources != null && sources.length > 0) { 4         this.sources.addAll(Arrays.asList(sources)); 5     } 6     this.webEnvironment = deduceWebEnvironment(); 7     setInitializers((Collection) getSpringFactoriesInstances( 8             ApplicationContextInitializer.class)); 9     setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));10     this.mainApplicationClass = deduceMainApplicationClass();11 }

首先,会把sources参数(也就是com.dylan.java.springboot.template.Application的class对象)添加到SpringApplication对象的sources属性,该属性是一个LinkedHashSet类型

然后接下来的一行调用了deduceWebEnvironment方法

1 private boolean deduceWebEnvironment() {2     for (String className : WEB_ENVIRONMENT_CLASSES) {3         if (!ClassUtils.isPresent(className, null)) {4             return false;5         }6     }7     return true;8 }
1 private static final String[] WEB_ENVIRONMENT_CLASSES = { "javax.servlet.Servlet",2             "org.springframework.web.context.ConfigurableWebApplicationContext" };

该方法会调用ClassUtils类的isPresent方法,检查classpath中是否存在javax.servlet.Servlet类和org.springframework.web.context.ConfigurableWebApplicationContext类,并赋值给SpringApplication对象的webEnvironment属性,该属性是一个boolean类型,表示启动的程序是否是一个web应用程序

接下来是第7行,主要是初始化ApplicationContextInitializer

在classpath下的JAR文件中包含的/META/spring.factories文件里找到org.springframework.context.ApplicationContextInitializer对应的属性,然后实例化并排序,设置到SpringApplication对象的initializers属性,该属性是一个ArrayList类型

接下来是第8行,主要是初始化ApplicationListener

在classpath下的JAR文件中包含的/META/spring.factories文件里找到org.springframework.context.ApplicationListener对应的属性,然后实例化并排序,设置到SpringApplication对象的listeners属性,该属性是一个ArrayList类型

最后调用deduceMainApplicationClass方法找到main函数所在的类,实现的方式是获取当前方法调用栈,找到main函数的类,并设置到SpringApplication对象的mainApplicationClass属性,该属性是一个Class类型

1 private Class
deduceMainApplicationClass() { 2 try { 3 StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); 4 for (StackTraceElement stackTraceElement : stackTrace) { 5 if ("main".equals(stackTraceElement.getMethodName())) { 6 return Class.forName(stackTraceElement.getClassName()); 7 } 8 } 9 }10 catch (ClassNotFoundException ex) {11 // Swallow and continue12 }13 return null;14 }

至此,SpringApplication对象的初始化完成

转载于:https://www.cnblogs.com/dylan-java/p/7455290.html

你可能感兴趣的文章
Windows7 支持即将终止!还有不知道的吗?
查看>>
学习springBoot(12)定时任务
查看>>
require()循环引用问题
查看>>
多行文字居中
查看>>
理解JavaScript 闭包
查看>>
Day9:html和css
查看>>
偏瘫能恢复吗?成都顾连康复治疗妙招
查看>>
微软ML.NET 0.10版分离处理表格数据增.NET生态系互操作性
查看>>
JDK, JRE和JVM的区别与联系
查看>>
Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API
查看>>
currentTarget VS target
查看>>
你所不知道的HTML5——语音合成
查看>>
Prettier your project
查看>>
RecyclerView顶部添加padding的方法
查看>>
web前端性能优化
查看>>
面试官“你的期望薪资是多少?”聪明的程序员都是这样答的!
查看>>
阿里巴巴资深技术专家无相:我们能从 InteliJ IDEA 中学到什么?
查看>>
Http请求首部Accept-Language
查看>>
手拉手教你实现一门编程语言 Enkel, 系列 14
查看>>
css实现图片背景填充的正六边形
查看>>