SpringBoot源码 - 启动
SpringBoot Application启动部分的源码阅读.
SpringApplication
常用的SpringApplication.run(Class, Args)启动Spring应用, 创建或者更新ApplicationContext
静态方法run
使用source类实例化一个SpringApplication实例, 并调用实例方法run.
public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
return new SpringApplication(sources).run(args);
}
初始化initialize
实例化的时候首先通过尝试加载
javax.servlet.Servlet和org.springframework.web.context.ConfigurableWebApplicationContext推断当前是否是web环境.然后从
spring.factories获取ApplicationContextInitializer的实现类.从
spring.factories获取ApplicationListener的实现类推断出应用的启动类(包含main方法的类): 检查线程栈中元素的方法名是否是
main
private Class<?> deduceMainApplicationClass() {
try {
//获取线程栈数据
StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();
for (StackTraceElement stackTraceElement : stackTrace) {
if ("main".equals(stackTraceElement.getMethodName())) {
return Class.forName(stackTraceElement.getClassName());
}
}
}
catch (ClassNotFoundException ex) {
// Swallow and continue
}
return null;
}
到此实例化就完成了.
复制状态机是通过复制日志来实现的, 按照日志中的命令的顺序来执行这些命令. 相同的状态机执行相同的日志命令, 获得相同的执行结果.