写于:2018-12-04 08:08:30

一、Spring Boot 应用启动方式-run方法直接启动

springboot概述 中,创建 spring boot 应用,导入 spring-boot-starter-web 后,通过一个 Application.java 便能够直接启动应用程序。

Application.java 主要启动代码

  1. @SpringBootApplication // 启动类标注
  2. public class Application {
  3. public static void main(String[] args) {
  4. // 真实启动的方法
  5. SpringApplication.run(Application.class, args);
  6. }
  7. }

上述代码直接通过 SpringApplication#run 方法便可以启动一个应用程序。

下面深入 SpringApplication#run 查看该方法究竟做了什么

SpringApplication#run 部分代码如下

  1. public class SpringApplication {
  2. public ConfigurableApplicationContext run(String... args) {
  3. StopWatch stopWatch = new StopWatch();
  4. stopWatch.start();
  5. ConfigurableApplicationContext context = null;
  6. FailureAnalyzers analyzers = null;
  7. configureHeadlessProperty();
  8. SpringApplicationRunListeners listeners = getRunListeners(args);
  9. listeners.starting();
  10. try {
  11. ApplicationArguments applicationArguments = new DefaultApplicationArguments(
  12. args);
  13. ConfigurableEnvironment environment = prepareEnvironment(listeners,
  14. applicationArguments);
  15. Banner printedBanner = printBanner(environment);
  16. // 创建 Spring 上下文
  17. context = createApplicationContext();
  18. analyzers = new FailureAnalyzers(context);
  19. prepareContext(context, environment, listeners, applicationArguments,
  20. printedBanner);
  21. // 重启IOC 容器
  22. refreshContext(context);
  23. afterRefresh(context, applicationArguments);
  24. listeners.finished(context, null);
  25. stopWatch.stop();
  26. if (this.logStartupInfo) {
  27. new StartupInfoLogger(this.mainApplicationClass)
  28. .logStarted(getApplicationLog(), stopWatch);
  29. }
  30. return context;
  31. }
  32. catch (Throwable ex) {
  33. handleRunFailure(context, listeners, analyzers, ex);
  34. throw new IllegalStateException(ex);
  35. }
  36. }
  37. }

抛开整体的代码不看,相信对 SpringFramework 有了解的人都知道,在 SpringApplication#run 方法中我们可以看到 ConfigurableApplicationContext 可配置的 Spring上下文 ,以及 refreshContext() 启动(重启) IOC 容器。 到这里能够知道 Spring Boot 本身还是运行的 springframework 。

定义一个简单的 mian 方法,通过代码的方式启动应用

从上面的分析,我们可以知道,spring boot 应用程序 Application.javarun 方法 可以理解为就是 在启动 spring IOC 容器,只不过 spring boot 在此基础上多做一些相关的操作。

简单启动 Spring 上下文,启动 IOC容器调用 容器方法 (WEB 应用类似) (spring-boot-learn-3)

  1. public class MyApplication {
  2. public static void main(String[] args) throws Exception{
  3. AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
  4. context.scan("com.qguofeng.controller");
  5. context.refresh();
  6. Learn3Controller bean = (Learn3Controller)context.getBean("learn3Controller");
  7. String s = bean.learn3();
  8. System.out.println(s);
  9. /*System.in.read();*/
  10. }
  11. }