SpringBoot(一)启动相关

280 阅读2分钟

SpringApplication启动

public static void main(String[] args) {
	SpringApplication.run(MySpringConfiguration.class, args);
}

当应用启动后,你会看到类似这样的控制台输出:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::   v2.0.3.RELEASE

2013-07-31 00:08:16.117  INFO 56603 --- [           main] o.s.b.s.app.SampleApplication            : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb)
2013-07-31 00:08:16.166  INFO 56603 --- [           main] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy
2014-03-04 13:09:54.912  INFO 41370 --- [           main] .t.TomcatServletWebServerFactory : Server initialized with port: 8080
2014-03-04 13:09:56.501  INFO 41370 --- [           main] o.s.b.s.app.SampleApplication            : Started SampleApplication in 2.992 seconds (JVM running for 3.658)

当应用启动失败,FailureAnalyzer会获取到错误并给出错误提示帮助解决问题,例如端口被占用,你会看到控制台输出:

***************************
APPLICATION FAILED TO START
***************************

Description:

Embedded servlet container failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.

应用事件和监听(Application Events and Listeners)

springboot除了spring框架的事件,例如 ContextRefreshedEvent,还有其他的一些应用事件。 一些事件会在ApplicationContext被创建之前触发,所以你不能注册监听到那些@Bean上,因为此时bean还没有被创建。你可以用SpringApplication.addListeners(…​) 这个方法去注册监听。 如果你想要自动注册监听,不管应用是否被创建,你可以通过META-INF/spring.factories文件去添加监听,例如:org.springframework.context.ApplicationListener=com.example.project.MyListener

应用启动时事件被发送的顺序

  1. ApplicationStartingEvent在所有处理之前,除了注册监听和初始化;
  2. ApplicationEnvironmentPreparedEvent发生在当上下文中使用的环境是已知的,但还没创建之前;
  3. ApplicationPreparedEvent 在刷新开始之前触发,但是在bean定义加载之后;
  4. ApplicationStartedEvent在上下文被刷新之后,在任何应用程序和命令行运行器被调用之前;
  5. ApplicationReadyEvent在任何应用程序和命令行运行程序都被调用之后。它指示应用程序已准备好服务请求;
  6. ApplicationFailedEvent如果启动时存在异常会被触发。

web环境

SpringApplication试图为您创建正确类型的应用程序上下文。用于确定WebApplicationType的算法相当简单:

  1. 如果当前使用的springMVC,上下文使用AnnotationConfigServletWebServerApplicationContext
  2. 如果当前使用的不是springMVC而是Spring WebFlux,上下文使用AnnotationConfigReactiveWebServerApplicationContext
  3. 否则,使用AnnotationConfigApplicationContext

下一篇上源码。。。