Spring boot 之自定義 Banner

spring boot 在應用程序啓動時會打印出 banner 信息。spring 是可擴展的,banner 也是能夠自由定製的,好比打印出我的的網站信息等,甚至是圖片,本文就來探討一下這個問題。spring

注:本文基於 spring boot 版本 1.5.12.RELEASE。編程

源碼分析

默認,spring boot 會打印出以下內容:源碼分析

ASCII Art,顯目的單詞 spring,附帶 spring boot 版本信息。網站

Spring boot 是如何處理的呢?spa

帶着問題,咱們來分析源碼,定位到 SpringApplication 類的 printBanner 方法,源碼以下:日誌

 

代碼比較簡單,咱們看到打印 banner 的操做委託給了 SpringApplicationBannerPrinter 類,再來看它的源碼:code

 

上述代碼,咱們稍加解釋:對象

  • 打印 banner 前天然先要獲取 Banner 對象blog

  • 打印 banner 的操做實際上由  Banner 自己來完成接口

  • 打印到日誌是先由 Banner 將內容輸出到內存中拿到打印內容後再委託給 logger 來打印

  • 打印到標準輸出是將 System.out 做爲參數傳入 Banner 對象做爲輸出目的地

咱們再來看看獲取 banner 這段代碼:

 

這段代碼大體邏輯:

  • 建立一個 Banners 對象,可組合多個 banner

  • 嘗試獲取基於圖片的 banner

  • 嘗試獲取基於文本的 banner

  • 前兩步操做完成後,若是拿到至少一個 banner 則返回 Banners 對象

  • 前兩步操做後都沒有獲取到 banner,返回自定義的 banner (若是存在)

  • 若自定義 banner 也不存在,返回默認的

注: Banners 也實現了 Banner 接口,運用了組合模式,實際上可同時打印圖片和文本 banner。

以上內容就是打印 banner 的大致邏輯,咱們再來看一看細節。

基於配置的方式自定義 Banner

看看基於圖片和文本兩種形式的 banner 獲取源碼:

注:爲了方便讀者閱讀,筆者把 spring 定義的常量替換成了原字符串自己

 

經過這段代碼,咱們可得出結論:

基於圖片的 banner

  • 可經過配置參數 banner.image.location 來指定

  • 可將名爲 banner.jpg (gif|png) 的文件放在 classpath 目錄

基於文件的 banner

  • 可經過配置參數 banner.location 來指定

  • 可將名爲 banner.txt 的文件放在 classpath 目錄


竟然能夠打印圖片,是否是很好玩,那麼咱們就來試一把。

咱們在 classpath 目錄下存放一個名爲 banner.jpg 的圖片,圖片以下:

 

同時也放一個名爲 banner.txt 的文件,內容爲:

Hello, Spring boot

運行程序,最終咱們看到以下效果:

 

圖片的打印效果是 ASCII 字符畫,太好玩了。ASCII 字符畫後面緊接着文本文件的內容。

至此,我相信你已經學會如何自定義一個好玩的 banner 了,但咱們的文章還要繼續。剛纔說的兩種方式是基於配置的形式,接下來咱們來講一下如何基於編程的方式來實現。

基於編程的方式自定義 Banner

既然要經過編程的方式實現,那天然要實現 Banner 接口了,源碼以下:

 

代碼也很簡單, 只定義了一個 printBanner 方法。

同時還定義了打印模式:

  • 禁用(不打印)

  • 控制檯(標準輸出)

  • 日誌

前面有提到 Banners ,咱們也看一下源碼:

 

Banners 也實現了 Banner 接口,內置一個 Banner 集合,運用了組合模式。

還記得前面提到的 spring 默認 Banner 麼,咱們來看一下源碼:

 

是否是很好玩,內置了 ASCII 字符畫。

既然咱們要編寫本身的 Banner,那麼很簡單,照葫蘆畫瓢。

看一下筆者的簡單實現:

 

Banner 實現好了,咱們怎麼使它生效呢。很簡單,咱們看一下啓動類:

 

咱們再看一下打印效果,以下圖:

 

看到這裏,你是否是很想本身實現一個有趣的 banner 呢?

小結

本文中咱們主要講了如何自定義 Banner,咱們既能夠經過配置的方式來指定 banner 文件又可經過編程的方式來實現。

相關文章
相關標籤/搜索