教你怎么用Springboot自定義Banner圖案
我們在啟動 Spring Boot 項目時,默認會在控制臺打印 Spring logo 和版本等信息,如下:
這就是 Spring Boot 的 Banner 打印功能,其實我們可以自定義打印的 banner ,也可以禁用和啟用打印 banner 功能。在真實項目中,我們一般不會去自定義 banner 圖案,它其實就是項目啟動時打印圖案或者文字而已,沒實際意義。推薦在自己個人項目玩玩這個彩蛋即可,順便簡單了解下它內部實現原理。
比如,自定義一個 banner 之后,項目啟動控制臺打印如下所示:
Spring Boot 有一個接口 org.springframework.boot.Banner 專門實現這個操作。要想自定義打印 banner ,只要自定義一個類實現這個接口,重寫 printBanner 方法進行打印即可。Springboot 項目啟動時,會創建我們的實現類對象,并調用對象的 printBanner 方法。
package org.springframework.boot;import java.io.PrintStream;import org.springframework.core.env.Environment;/** * Interface class for writing a banner programmatically. * 用于以編程方式編寫 banner 的接口類 * @since 1.2.0 */@FunctionalInterfacepublic interface Banner {/** * Print the banner to the specified print stream. * 將 banner 打印到指定的打印流。 * @param environment the spring environment * @param sourceClass the source class for the application * @param out the output print stream */void printBanner(Environment environment, Class<?> sourceClass, PrintStream out);// 用于配置Banner的的枚舉值enum Mode {// 關閉 banner 打印OFF,// 打印 banner 到 控制臺CONSOLE,// 打印 banner 到日志文件LOG}}三、默認 Banner 實現類
Springboot 已經有幾個自帶的 Banner 實現類,Springboot 啟動時會根據條件選擇不同的 Banner 實現類進行打印 banner 信息。主要是 ImageBanner,ResourceBanner,SpringBootBanner 這三個實現類。
1.項目啟動時,會判斷是否某些條件成立(項目中是否存在 banner 文件),成立則創建 ImageBanner 和 ResourceBanner 類對象,并且使用它們來打印 banner。
2.如果不成立檢查是否存在我們自定義的 Banner 實現類 fallbackBanner,如果存在則使用它來打印 banner 圖案。
3.否則,則使用默認的 SpringBootBanner 實現類來打印 banner,也就是我們經常看到 Spring 圖案。
// 獲取可用的 Banner 實現類private Banner getBanner(Environment environment) {Banners banners = new Banners();banners.addIfNotNull(getImageBanner(environment));banners.addIfNotNull(getTextBanner(environment));if (banners.hasAtLeastOneBanner()) {return banners;}if (this.fallbackBanner != null) {return this.fallbackBanner;}// SpringBootBanner 實現類return DEFAULT_BANNER;}四、ImageBanner
org.springframework.boot.ImageBanner 類是專門加載和打印圖片 banner 的。它檢查配置文件 application.proeprties 是否有配置的 spring.banner.image.location 變量的值,這個值可用來指定要加載的圖片,如果存在則構建 ImageBanner 對象。如果沒有配置變量,則還會檢查 Classpath 下是否存在以 banner 開頭,以 .gif,.jpg,.png 結尾的圖片文件,如果有也會構建 ImageBanner 對象。
class SpringApplicationBannerPrinter {static final String BANNER_IMAGE_LOCATION_PROPERTY = 'spring.banner.image.location';static final String[] IMAGE_EXTENSION = { 'gif', 'jpg', 'png' };// 獲取 ImageBanner 對象private Banner getImageBanner(Environment environment) { // 加載 spring.banner.image.location 指定的文件,文件存在則構建 ImageBanner 對象String location = environment.getProperty(BANNER_IMAGE_LOCATION_PROPERTY);if (StringUtils.hasLength(location)) {Resource resource = this.resourceLoader.getResource(location);return resource.exists() ? new ImageBanner(resource) : null;}// 查找 banner.gif,banner.jpg,banner.png 文件for (String ext : IMAGE_EXTENSION) {Resource resource = this.resourceLoader.getResource('banner.' + ext);if (resource.exists()) {return new ImageBanner(resource);}}return null;}}五、ResourceBanner
org.springframework.boot.ResourceBanner 類是專門加載和打印字符 banner 的。它檢查配置文件 application.proeprties 是否有配置的 spring.banner.location 變量的值,這個值可用來指定要加載的文件,如果存在則構建 ResourceBanner 對象。如果沒有配置變量,則還會檢查資源路徑下是否存在 banner.txt 文件,如果存在也會構建 ResourceBanner 對象。
class SpringApplicationBannerPrinter {static final String BANNER_LOCATION_PROPERTY = 'spring.banner.location';static final String DEFAULT_BANNER_LOCATION = 'banner.txt';// 獲取 ResourceBanner 對象private Banner getTextBanner(Environment environment) {String location = environment.getProperty(BANNER_LOCATION_PROPERTY, DEFAULT_BANNER_LOCATION);Resource resource = this.resourceLoader.getResource(location);if (resource.exists()) {return new ResourceBanner(resource);}return null;}}
如果想要自定義 banner,我們一般在項目的 resources 資源目錄下創建 banner.txt 文件,然后在里面填入我們想要的打印的文字內容即可。例如我在 banner.txt 文件中填充了 Chen Pi 內容,然后啟動項目。
如果項目沒有設置以上兩種自定義的 banner(ImageBanner 和 ResourceBanner),則默認情況下,會使用 SpringBootBanner 實現類打印 banner ,也就是我們啟動 Springboot 項目時在控制臺看到的打印 Spring 圖案。源碼如下:
package org.springframework.boot;import java.io.PrintStream;import org.springframework.boot.ansi.AnsiColor;import org.springframework.boot.ansi.AnsiOutput;import org.springframework.boot.ansi.AnsiStyle;import org.springframework.core.env.Environment;/** * Default Banner implementation which writes the ’Spring’ banner. */class SpringBootBanner implements Banner {// 這個就是我們啟動 Springboot 項目時在控制臺看到的圖案private static final String[] BANNER = { '', ' . ____ _ __ _ _',' / / ___’_ __ _ _(_)_ __ __ _ ', '( ( )___ | ’_ | ’_| | ’_ / _` | ',' / ___)| |_)| | | | | || (_| | ) ) ) )', ' ’ |____| .__|_| |_|_| |___, | / / / /',' =========|_|==============|___/=/_/_/_/' };private static final String SPRING_BOOT = ' :: Spring Boot :: ';private static final int STRAP_LINE_SIZE = 42;@Overridepublic void printBanner(Environment environment, Class<?> sourceClass, PrintStream printStream) {for (String line : BANNER) {printStream.println(line);}String version = SpringBootVersion.getVersion();version = (version != null) ? ' (v' + version + ')' : '';StringBuilder padding = new StringBuilder();while (padding.length() < STRAP_LINE_SIZE - (version.length() + SPRING_BOOT.length())) {padding.append(' ');}printStream.println(AnsiOutput.toString(AnsiColor.GREEN, SPRING_BOOT, AnsiColor.DEFAULT, padding.toString(),AnsiStyle.FAINT, version));printStream.println();}}七、實現 Banner 類
前面說我們可以實現 Banner 類,重寫打印方法,實現自定義 banner 打印功能。
package com.chenpi;import java.io.PrintStream;import org.springframework.boot.Banner;import org.springframework.core.env.Environment;/** * @Description 自定義 Banner 實現類 * @Author Mr.nobody * @Date 2021/6/4 * @Version 1.0 */public class MyBanner implements Banner { @Override public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) { String banner = ' .__ .__ n' + ' ____ | |__ ____ ____ ______ |__|n' + '_/ ___| | _/ __ / ____ | |n' + ' ___| Y ___/| | | |_> > |n' + ' ___ >___| /___ >___| / | __/|__|n' + ' / / / / |__| '; out.println(banner); }}
創建自定義的 Banner 實現類對象,設置到 SpringApplication 類對象的 banner 屬性,最終這個屬性的值會會被賦值到 SpringApplicationBannerPrinter 對象的 fallbackBanner 屬性中,感興趣的可以啟動 debug 跟蹤下。
package com.chenpi;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class SpringBootBannerApplication {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication(SpringBootBannerApplication.class);// 設置自定義 BannerspringApplication.setBanner(new MyBanner());// 啟動 SpringBootspringApplication.run(args);}}八、Banner 樣式控制
文章一開始的佛祖圖形,你會發現是翠綠色的。其實 Springboot 支持我們修改 banner 的顏色,字體斜體,粗體等樣式。SpringBoot 為我們提供了三個枚舉類來設定這些樣式。
1.AnsiColor:設定字符的前景色;參考 org.springframework.boot.ansi.AnsiColor 枚舉類。
2.AnsiBackground:設定字符的背景色;參考 org.springframework.boot.ansi.AnsiBackground 枚舉類。
3.AnsiStyle:設定字符的加粗、斜體、下劃線等等;參考 org.springframework.boot.ansi.AnsiStyle 枚舉類。
而且,在 banner.txt 文件中還可以引用一些全局變量,例如:
1.${spring-boot.version}:Spring Boot 版本號;
2.${spring-boot.formatted-version}:格式化后的 Spring Boot 版本號信息。
3.${application.version}:MANIFEST.MF 文件中的版本號;
4.${application.formatted-version}:格式化后的 MANIFEST.MF 文件中的版本號信息;
不僅如此,還可以引用我們在配置文件 application.properties 中定義的變量,例如在配置文件中定義了如下變量:
application.auth=chenpi
定義的 banner.txt 文件內容如下:
${AnsiColor.BRIGHT_GREEN}// _ooOoo_ //// o8888888o //// 88' . '88 //// (| ^_^ |) //// O = /O //// ____/`---’____ //// .’ | |// `. //// / ||| : |||// //// / _||||| -:- |||||- //// | | - /// | | //// | _| ’’---/’’ | | //// .-__ `-` ___/-. / ////___`. .’ /--.-- `. . ___ //// .'' ’< `.____<|>_/___.’ >’''. //// | | : `- `.;` _ /`;.`/ - ` : | | //// `-. _ __ /__ _/ .-` / / //// ========`-.____`-.________/___.-`____.-’======== //// `=---=’ //// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//// 佛祖保佑 永不宕機 永無BUG //${AnsiColor.BRIGHT_CYAN}Application Version: ${application.version}${application.formatted-version}Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}By -- ${application.auth}
啟動項目,會在控制臺打印的 banner 如下:
在 Banner 接口中有定義一個枚舉類,這個枚舉定義了配置 Banner 的可能枚舉值,如下:
@FunctionalInterfacepublic interface Banner {// 用于配置Banner的的枚舉值enum Mode {// 關閉 banner 打印OFF,// 打印 banner 到 控制臺CONSOLE,// 打印 banner 到日志文件LOG}}
所以我們可以選擇關閉 banner,banner 打印到控制臺還是日志文件,如下:
package com.chenpi;import org.springframework.boot.Banner.Mode;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class SpringBootBannerApplication { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(SpringBootBannerApplication.class); // 關閉 banner springApplication.setBannerMode(Mode.OFF); // 啟動 SpringBoot springApplication.run(args); }}
也可以配置文件中設置此值,如下
spring.main.banner-mode=off
如果啟動類跟配置文件中都配置了對banner開關的設置,配置文件中設置的banner開關會優先于啟動類中設置的開關。
十、banner 圖生成工具可能有人會問佛祖的圖案怎么編輯出來的,其實網上有很多工具可以根據我們輸入的內容或者圖片,個性化制作ASCII字符和圖案,推薦網址如下:
定制化 ASCII 字符:http://network-science.de/ascii/ 定制化 ASCII 圖片:https://www.degraeve.com/img2txt.php到此這篇關于教你怎么用Springboot自定義Banner圖案的文章就介紹到這了,更多相關Springboot自定義Banner圖案內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
相關文章: