英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-spring-application.htmlGitHub:https://github.com/jijicai/Spring/tree/master/spring-boot
23.3、自定義 SpringApplication
如果你不喜歡 SpringAppliction 的預設設定,那麼你可以建立一個本地例項並定製它。例如,要關掉 banner,可以寫:
public static void main(String[] args) { SpringApplication app = new SpringApplication(MySpringConfiguration.class); app.setBannerMode(Banner.Mode.OFF); app.run(args);}
註釋:傳遞給 SpringApplication 的建構函式引數是 Spring bean 的配置源。在大多數情況下,這些都是對 @Configuration 類的引用,但它們也可以是對 XML 配置或應該掃描的包的引用。
也可以使用 application.properties 檔案配置 SpringApplication。詳見第 24 章:外部化配置。
有關配置選項的完整列表,請參閱 SpringApplication Javadoc。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/api/org/springframework/boot/SpringApplication.html)
23.4、Fluent 構建器 API
如果需要構建 ApplicationContext 層次結構(具有父子關係的多個上下文),或者如果希望使用”fluent“構建器 API,則可以使用 SpringApplicationBuilder。
SpringApplicationBuilder 允許你將多個方法呼叫連結在一起,幷包括 parent 和 child 方法,這些方法允許你建立層次結構,如下面示例所示:
new SpringApplicationBuilder() .sources(Parent.class) .child(Application.class) .bannerMode(Banner.Mode.OFF) .run(args);
註釋:建立 ApplicationContext 層次結構時有一些限制。例如,Web 元件必須包含在子上下文中,並且父上下文和子上下文都使用相同的環境。有關詳細資訊,請參閱 SpringApplicationBuilder Javadoc。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/api/org/springframework/boot/builder/SpringApplicationBuilder.html)
23.5、應用程式事件和監聽器
除了常見的 Spring 框架事件(如ContextRefreshedEvent)之外,SpringApplication 還發送一些附加的應用程式事件。
註釋:有些事件實際上是在建立 ApplicationContext 之前觸發的,因此不能將監聽器註冊為 @Bean。你可以使用 SpringApplication.addListeners(...) 方法或 SpringApplicationBuilder.listeners(...) 方法註冊它們。如果希望自動註冊這些監聽器而不管建立應用的方式,則可以將 META-INF/spring.factories 檔案新增到專案中並且通過使用 org.springframework.context.ApplicationListener 鍵來引用監聽器,如下面示例所示:
org.springframework.context.ApplicationListener=com.example.project.MyListener
應用程式執行時,將按以下順序傳送應用程式事件:
(1)ApplicationStartingEvent 在執行開始時但在任何處理之前傳送,監聽器和初始化器的註冊除外。
(2)ApplicationEnvironmentPreparedEvent 在上下文中使用的環境已知時但在建立上下文之前傳送。
(3)ApplicationPreparedEvent 只在開始重新整理之前但在載入 bean 定義之後傳送。
(4)ApplicationStartedEvent 在重新整理上下文之後但在呼叫任何應用程式和命令列的執行器之前傳送。
(5)ApplicationReadyEvent 在呼叫任何應用程式和命令列執行器之後傳送。這表明應用已準備好服務請求。
(6)ApplicationFailedEvent 在啟動出現異常時傳送。
提示:你通常不需要使用應用程式事件,但知道它們的存在是很方便的。在內部,Spring Boot 使用事件來處理各種任務。
應用程式事件通過使用 Spring 框架的事件釋出機制傳送。此機制的一部分確保在子上下文中釋出給監聽器的事件也在任何祖先上下文中釋出給監聽器。因此,如果應用程式使用 SpringApplication 例項的層次結構,則監聽器可能會接收到同一型別應用程式事件的多個例項。
為了允許監聽器區分其上下文的事件和子上下文的事件,它應該請求注入其應用程式上下文,然後將注入的上下文與事件的上下文進行比較。上下文可以通過實現 ApplicationContextAware 注入,如果監聽器是 bean,則可以使用 @Autowired 注入。