最新消息: 关于Git&GitHub 版本控制你了解多少?
您现在的位置是:群英 > 开发技术 > 移动开发 >
Spring Boot 运行操作你知道吗?
IT168发表于 2020-12-07 15:59 次浏览
Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较流行的微服务框架SpringCloud快速地集成。
 
在我们实际使用Spring Boot进行项目开发的过程中,往往只需要几个很简单的注解配置就能够将应用启动运行了,相比于传统的Spring项目而已,这种提升大大地提高了我们的研发效率。然而,这种便捷性则是通过高度地上层封装来实现的,如:“大量的注解封装、约定大于配置的原则“等手段。所以,也许你已经使用Spring Boot开发很多个项目了,但对Spring Boot的运行原理真的搞清楚了吗?在今天的文章中,小编将为大家全方位地梳理下Spring Boot的底层运行原理,希望对您的工作或者面试能够有所帮助!

SpringApplication一瞥

SpringApplication 这个类应该算是 Spring Boot 框架 本身的“创新”产物了,因为原始的Spring框架中并没有这个类,SpringApplication 里面封装了一套Spring应用的启动流程,然而这对用户完全透明,因此我们上手 Spring Boot 时感觉简洁且轻量。

一般来说默认的 SpringApplication 执行流程已经可以满足大部分需求,但是 若用户想干预这个过程,则可以通过 SpringApplication 在流程某些地方开启的 扩展点 来完成对流程的扩展,典型的扩展方案那就是使用 set 方法。

我们来举一个栗子,把我们天天司空见惯的 Spring Boot 应用的启动类来拆解一下写出来:

@SpringBootApplication
public class CodeSheepApplication {
 public static void main( String[] args ) {
  // SpringApplication.run( CodeSheepApplication.class args ); // 这是传统Spring Boot应用的启动,一行代码搞定,内部默认做了很多事
  SpringApplication app = new SpringApplication( CodeSheepApplication.class );
  app.setXXX( ... ); // 用户自定的扩展在此 !!!
  app.run( args );
 }
}

这样一拆解后我们发现,我们也需要先构造 SpringApplication 类对象,然后调用该对象的 run() 方法。

那么接下来就聊聊 SpringApplication 的构造过程 以及其 run()方法的流程,搞清楚了这个,那么也就搞清楚了Spring Boot应用是如何运行起来的了。


SpringApplication实例的初始化

还是先对照代码来看:

springboot配置文件

四个关键的步骤已标注在图中,分别解释如下:

  • ① 推断应用的类型:创建的是REACTIVE应用、SERVLET应用、NONE 三种中的某一种
springboot配置文件
  • ② 使用SpringFactoriesLoader查找并加载classpath下META-INF/spring.factories文件中所有可用的 ApplicationContextInitializer
springboot配置文件
  • ③ 使用SpringFactoriesLoader查找并加载classpath下META-INF/spring.factories文件中的所有可用的 ApplicationListener
springboot配置文件
  • ④ 推断并设置main方法的定义类
springboot配置文件

SpringApplication的run()方法探秘

先看看代码长啥样子:

springboot配置文件

关键步骤都已经用数字标注在上图之中了,除此之外,这里也画了一个流程图对照理解:

springboot配置文件

我们将各步骤总结精炼如下:

  1. 通过 SpringFactoriesLoader 加载 META-INF/spring.factories 文件,获取并创建 SpringApplicationRunListener 对象

  2. 然后由 SpringApplicationRunListener 来发出 starting 消息

  3. 创建参数,并配置当前 SpringBoot 应用将要使用的 Environment

  4. 完成之后,依然由 SpringApplicationRunListener 来发出 environmentPrepared 消息

  5. 创建 ApplicationContext

  6. 初始化 ApplicationContext,并设置 Environment,加载相关配置等

  7. 由 SpringApplicationRunListener 来发出 contextPrepared 消息,告知Spring Boot 应用使用的 ApplicationContext 已准备OK

  8. 将各种 beans 装载入 ApplicationContext,继续由 SpringApplicationRunListener 来发出 contextLoaded 消息,告知 Spring Boot 应用使用的 ApplicationContext 已装填OK

  9. refresh ApplicationContext,完成IoC容器可用的最后一步

  10. 由 SpringApplicationRunListener 来发出 started 消息

  11. 调用callRunners(...)方法,让实现了ApplicationRunner和CommandLineRunner接口类的run 方法得以执行,用于在 Spring 应用上下文准备完毕后,执行一些额外操作。从而完成最终的程序的启动。

  12. 由 SpringApplicationRunListener 来发出 running 消息,告知程序已运行起来了

至此,全流程结束。


标签:springboot服务
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
相关信息推荐
2020-12-31 14:41:13 关键词:springboot服务
摘要:SpringBoot的主要功能都是依靠它内部很多的扩展点来完成的,那毋容置疑,这些扩展点是我们应该深入了解的,那么本次且听我一一道来SpringBoot的各类扩展点。 1 .可扩展的接口启动调用..