天天看點

飛5的Spring Boot2(11)- 自定義事件

飛5的Spring Boot2(11)- 自定義事件

自定義SpringApplication​

如果預設的SpringApplication的預設設定不符合您的喜好,那麼可以通過自定義對其進行設定。

比如不顯示bannner,我們可以這樣寫:

1public static void main(String[] args) {
2    SpringApplication app = new SpringApplication(MySpringConfiguration.class);
3    app.setBannerMode(Banner.Mode.OFF);
4    app.run(args);
5}      

這樣在啟動應用的時候我們就能夠看到不加載banner資訊了!

注意:

傳遞給SpringApplication的構造函數的參數是Spring bean的配置源。 在大多數情況下,它們都是對@Configuration類的引用,也可能是對XML配置或應掃描的包的引用。

如果不通過代碼配置,可以直接通過application.properties對需要修改的内容進行配置。

流生成器API

如果你想建構層次結構的程式,可以使用SpringApplicationBuilder。通過SpringApplicationBuilder來對SpringApplication的屬性進行配置,這樣的結構更有層次感。SpringApplicationBuilder為建構 SpringApplication 和 ApplicationContext 執行個體提供了一套便利的流式API:示例代碼如下:

1new SpringApplicationBuilder()
2        .sources(Parent.class)
3        .child(Application.class)
4        .bannerMode(Banner.Mode.OFF)
5        .listeners(new MyListener())
6        ...
7        .run(args);      

注意:

SpringApplication将會根據需要建立一個ApplicationContext,預設情況下,如果是非web應用,則會建立一個AnnotationConfigApplicationContext上下文,如果是web應用,則會建立一個AnnotationConfigEmbeddedWebApplicationContext上下文。當然,你也可以通過setWebEnvironment(boolean webEnvironment)來覆寫預設的設定。

事件監聽

spring boot在啟動過程中增加事件監聽機制,為使用者功能拓展提供極大的便利。

應用事件按如下順序運作:

  1. ApplicationStartingEvent在運作開始時但在任何處理之前發送,除了注冊偵聽器和初始化器之外。
  2. 當在上下文中使用的環境是已知的但在建立上下文之前發送ApplicationEnvironmentPreparedEvent。
  3. ApplicationPreparedEvent在重新整理開始之前但在bean定義加載之後發送。
  4. 在重新整理上下文之後但在調用任何應用程式和指令行參賽者之前發送ApplicationStartedEvent。
  5. ApplicationReadyEvent在任何應用程式和指令行參數被調用後發送。 它表示應用程式已準備好為請求提供服務。
  6. 如果啟動時出現異常,則發送ApplicationFailedEvent。

以上這些事件預設不需要修改。

ApplicationListener

在一些業務場景中,當容器初始化完成之後,需要處理一些操作,比如一些資料的加載、初始化緩存、特定任務的注冊等等。這個時候我們就可以使用Spring提供的ApplicationListener來進行操作。

首先,需要實作ApplicationListener接口并實作onApplicationEvent方法。把需要處理的操作放在onApplicationEvent中進行處理:

1public class ApplicationStartListener implements ApplicationListener<ContextRefreshedEvent>{
2    @Override
3    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
4        System.out.println("我的父容器為:" + contextRefreshedEvent.getApplicationContext().getParent());
5        System.out.println("初始化時我被調用了。");
6    }
7}      
1@Configuration
2public class ListenerConfig {
3    @Bean
4    public ApplicationStartListener applicationStartListener(){
5        return new ApplicationStartListener();
6    }
7}      
12018-05-03 11:01:36.272  INFO 12092 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2我的父容器為:null
3初始化時我被調用了。
42018-05-03 11:01:36.467  INFO 12092 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
52018-05-03 11:01:36.473  INFO 12092 --- [           main] com.cloud.skyme.Application              : Started Application in 5.556 seconds (JVM running for 7.162)