如何简述 SpringBoot 的启动原理?

回答·56
最热
最新
  • spring boot 启动 spring boot 的启动代码很简单,最精简的代码如下。 @Configuration @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 注意:spring启动的main方法必须包含在包内 启动代码很简单,但在初始化过程中,spring做了很多工作,打开run方法,我们可以看到如下代码 public static ConfigurableApplicationContext run(Object[] sources, String[] args) { return new SpringApplication(sources).run(args); } 大致分为两部分。 加载配置信息 启动 加载配置信息 初始化的主要工作都在这个方法中完成。 private void initialize(Object[] sources) { if (sources != null && sources.length > 0) { this.sources.addAll(Arrays.asList(sources)); } this.webEnvironment = deduceWebEnvironment(); setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class)); setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); this.mainApplicationClass = deduceMainApplicationClass(); } 通过判断是否包含WEB_ENVIRONMENT_CLASSES中定义的类来决定是否是web项目。 我们应用的是compile("org.springframework.boot:spring-boot-starter-web"), 所以间接引用了org.springframework.web.context.ConfigurableWebApplicationContext,推论为web环境。 如果只引用org.springframework.boot:spring-boot-starter,就不是web项目,不会启动内置的tomcat。
  • (1)main 函数入口 (2)加载 Spring 上下文 (3)加载并初始化各种 bean (4)如果是 web 项目(根据 classpath 包含的类判断),启动 embedded 的服务器(默认 tomcat,可以通过 pom 改成其他服务器)。
  • Springboot 有内嵌的 tomcat 通过 application 中的 run 中的 onstartup 方法启动 主要是根据 servlet3.0 版本   还有 spi 机制
  • 1:执行 main->run 方法 2:run 方法会执行 SpringApplication 构造器 3:SpringApplication 构造器里面会做四件事 3.1:判断可能的 web 应用程序类型:应用类型分为四种:1.NONE 不是 web 应用;2.SERVLET servlet 容器;3.REACTIVE 反应型 web 应用(webflux)由于一开始在 pom 文件里加载了 web 依赖,所以未 servlet 容器 3.2:初始化应用上下文:通过 getSpringFactoriesInstances 参数为 ApplicationContextInitializer-》loadFactoryNames-》loadSpringFactories 先去缓存中拿,如果没有再去资源路径下加载,资源文件在 spring-boot-2.1.5.RELEASE.jar 下的 spring.factores 之后把加载到的需要初始化的类进行实例化,添加到一个集合中备用 3.3:初始化监听器类:和初始化应用上下文的流程一样,只是传入的参数不同 getSpringFactoriesInstances 参数为 ApplicationListener3.4:推演主程序通过方法 deduceMainApplicationClass()获取 StackTrace 中的内容并遍历 StackTraceElement 数组这样就能观察到从开始到现在的方法间调用流程,通过判断方法名是否为“main”,如果为 main 则通过反射返回 4:在 SpringApplication 构造完成之后:要执行 SpringApplication(primarySources).run(args)的 run 方法,
  • 1 @SpringBootApplication 注解的加载。 2 加载 bean 工厂,和获取 Spring 上下文。 3 加载配置文件和环境变量。 4 内嵌 Tomcat 的初始化和启动。
  • 不会,请问下一个问题
  • 现在的面试看不懂  初级面试问框架底层和原理  还要问底层实现或源码  高级面试问你基本数据类型加长度。。。。
  • 内置 tomcat 启动,Servlet#init() 执行,init() 中对需要加载的资源进行定位和加载,加载完毕后初始化 WEB 容器,最终调用了 refresh() 方法初始化 IOC 容器,等待 IOC 容器初始化完毕后,紧接着调用 onRefresh() 初始化 spring mvc 九大组件,至此,Spring boot 初始化完毕,根据源码,我画了一个时序图,分享给需要的你 https://www.processon.com/view/link/5e24088ce4b00fbcc45c1f84
  • SpringBoot 在启动的时候从类路径下的 META-INF/spring.factories 中获取 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
  • 什么都要知道为什么,你们累不累,会用就行了!现在面试怎么不问代码怎么在 cpu 的电子元上运行的呢?以后考驾照还要加机修考核!