1. 程式人生 > >Spring Boot(七)擴展分析

Spring Boot(七)擴展分析

初始化 arr throws 使用 關閉 監聽器 getenv and 註冊

前面的章節在分析SpringBoot啟動過程中,我們發現SpringBoot使用Spring框架提供的SpringFactoriesLoader這個類,實現檢索META-INF/spring.factories配置文件,並從配置文件中獲取指定配置項(通常是特定的接口實現類),並實例化後加載到Spring容器,這個機制為SpringBoot提供了方便的擴展工能。下面列舉幾個擴展點逐一說明擴展方式:

擴展ApplicationContextInitializer接口

ApplicationContextInitializer這個接口的功能主要是在Spring應用上下文(ConfigurableApplicationContext)執行refresh之前調用,官方文檔中的描述是“通常被用作web應用,在一些程序設計在spring容器初始化使用。比如說註冊一些熟悉配置或者激活一些配置文件針對(ConfigurableApplicationContext的getEnvironment()方法)”,擴展這個接口可以實現一些額外的處理。

擴展代碼如下,只需要實現接口中的initialize()方法即可,並將該實例添加到容器中:

1 @Order(1)
2 public class ApplicationContextInitializerTest implements org.springframework.context.ApplicationContextInitializer<ConfigurableApplicationContext> {
3     @Override
4     public void initialize(ConfigurableApplicationContext applicationContext) {
5 6 System.out.println("這裏是自定義ApplicationContextInitializer,可以用來操作applicationContext"); 7 8 } 9 }

可以通過下面任一中方式添加到Spring容器中:

  • 直接在SpringBoot入口main函數中添加application.addInitializers(new ApplicationContextInitializerTest());
  • 通過在application.properties中添加配置項:
context.initializer.class
=com.sl.springbootdemo.extendsion. ApplicationContextInitializerTest

   如果擴展了多個Initialize則可以通過逗號分隔(為什麽可以這麽配置可以查看springboot jar包提供的類:DelegatingApplicationContextInitializer)

  • 之前分析SpringBoot啟動過程,我們知道SpringBoot啟動時會讀取META-INF/spring.factories中的配置項,那麽自定義的Initialize也通過在項目自定義的META-INF/spring.factories文件中註冊
 org.springframework.context.ApplicationContextInitializer= com.sl.springbootdemo.extendsion. ApplicationContextInitializerTest

擴展CommandLineRunner或者ApplicationRunner接口

CommandLineRunner、ApplicationRunner 接口的功能是在容器啟動成功後的最後一步調用,分析過源碼可以知道有個callrunners()方法,這兩個接口是SpringBoot框架提供,兩個接口的區別也只是參數類型不同。

擴展CommandLineRunner:

1 @Order(2)
2 @Component
3 public class CommandLineRunnerTest implements CommandLineRunner {
4     @Override
5     public void run(String... args) throws Exception {
6         System.out.println("擴展CommandLineRunner,打印出來看看");
7     }
8 }

擴展ApplicationRunner:

@Order(3)
@Component
public class ApplicationRunnerTest implements ApplicationRunner {

    //ApplicationArguments是對參數(main方法)做了進一步封裝
    @Override
    public void run(ApplicationArguments args) throws Exception {

        System.out.println("===MyApplicationRunner==="+ Arrays.asList(args.getSourceArgs()));
        System.out.println("===getOptionNames========"+args.getOptionNames());
        System.out.println("===getOptionValues======="+args.getOptionValues("name"));
        System.out.println("==getOptionValues========"+args.getOptionValues("password"));

    }
}

擴展ApplicationListener

監聽器的擴展可以參考上一章:Spring Boot(六)自定義事件及監聽

自定義Banner

Banner修不修該本身並沒什麽意義,SpringBoot啟動的時候會打印出一個很醜的“SPRING”幾個大字母

  • 關閉Banner

在SpringBoot入口main函數中加入如下代碼即可關閉打印Banner

  springApplication.setBannerMode(Banner.Mode.OFF);
  • 修改Banner

在SpringBoot項目resources目錄下新建一個banner.txt文件,再次啟動將會打印banner.txt中的內容,文本中盡管放一些天馬行空的內容好了。

比如下面這樣的就比較中國風:

技術分享圖片

Spring Boot(七)擴展分析