Spring Boot(七)擴展分析
前面的章節在分析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(七)擴展分析