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 獲取源碼:
注:爲了方便讀者閱讀,筆者把 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 接口了,源碼以下:
代碼也很簡單, 只定義了一個 printBanner 方法。
同時還定義了打印模式:
禁用(不打印)
控制檯(標準輸出)
日誌
前面有提到 Banners ,咱們也看一下源碼:
Banners 也實現了 Banner 接口,內置一個 Banner 集合,運用了組合模式。
還記得前面提到的 spring 默認 Banner 麼,咱們來看一下源碼:
是否是很好玩,內置了 ASCII 字符畫。
既然咱們要編寫本身的 Banner,那麼很簡單,照葫蘆畫瓢。
看一下筆者的簡單實現:
Banner 實現好了,咱們怎麼使它生效呢。很簡單,咱們看一下啓動類:
咱們再看一下打印效果,以下圖:
看到這裏,你是否是很想本身實現一個有趣的 banner 呢?
本文中咱們主要講了如何自定義 Banner,咱們既能夠經過配置的方式來指定 banner 文件又可經過編程的方式來實現。