SpringBoot(一)啟動相關

請叫我王蜀黍發表於2018-07-18

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

下一篇上原始碼。。。

相關文章