SpringBoot之自定義Banner詳解
1、在線生成banner網(wǎng)站
https://www.bootschool.net/ascii http://www.network-science.de/ascii/ http://patorjk.com/software/taag/ http://www.degraeve.com/img2txt.php
2、兩種自定義Banner方式
在自定義Banner之前,先剖析一下源碼,源碼跟蹤解析如下:
- SpringBoot啟動的main方法
public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(Application.class); //開啟Banner打印方式(OFF:關(guān)閉,CONSOLE:控制臺輸出,LOG:日志輸出) springApplication.setBannerMode(Mode.LOG); springApplication.run(args); }
- SpringApplication.printBanner():
private Banner printBanner(ConfigurableEnvironment environment) { //是否開啟Banner模式 if (this.bannerMode == Mode.OFF) { return null; } else { ResourceLoader resourceLoader = this.resourceLoader != null ? this.resourceLoader : new DefaultResourceLoader((ClassLoader)null); SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter((ResourceLoader)resourceLoader, this.banner); return this.bannerMode == Mode.LOG ? bannerPrinter.print(environment, this.mainApplicationClass, logger) : bannerPrinter.print(environment, this.mainApplicationClass, System.out); } }
- SpringApplicationBannerPrinter.print()
Banner print(Environment environment, Class<?> sourceClass, Log logger) { //調(diào)用getBanner()方法 Banner banner = this.getBanner(environment); try { logger.info(this.createStringFromBanner(banner, environment, sourceClass)); } catch (UnsupportedEncodingException var6) { logger.warn("Failed to create String for banner", var6); } return new SpringApplicationBannerPrinter.PrintedBanner(banner, sourceClass); }
- SpringApplicationBannerPrinter.getBanner()
private Banner getBanner(Environment environment) { SpringApplicationBannerPrinter.Banners banners = new SpringApplicationBannerPrinter.Banners(); //先獲取image類型的banner banners.addIfNotNull(this.getImageBanner(environment)); //在獲取text類型的banner banners.addIfNotNull(this.getTextBanner(environment)); if (banners.hasAtLeastOneBanner()) { // 如果至少有一個(gè),則返回 // Banners 也實(shí)現(xiàn)了 Banner 接口,運(yùn)用了組合模式,實(shí)際上可同時(shí)打印圖片和文本 banner。 return banners; } else { // 返回自定義的banner(this.fallbackBanner) 或者 springboot默認(rèn)的banner(DEFAULT_BANNER) // 默認(rèn)的banner類:SpringBootBanner。 // 自定義的banner:需要我們仿照SpringBootBanner去自定義一個(gè)類 //this.fallbackBanner: 表示自定義的banner,此參數(shù)可在springboot啟動類的main方法中設(shè)置,后續(xù)會介紹 // public static void main(String[] args) { // SpringApplication springApplication = new SpringApplication(Application.class); // springApplication.setBanner(new MyBanner());//自定義的banner // springApplication.run(args); // } return this.fallbackBanner != null ? this.fallbackBanner : DEFAULT_BANNER; } }
解釋:banner的獲取方式有兩種,先獲取image類型的banner,然后獲取text類型的banner,如果至少有一個(gè),則執(zhí)行該banner,如果沒有,返回自定義的banner,如果自定義也沒有,則返回默認(rèn)
那么上述源碼中是如何獲取image類型和Text類型的banner呢?
SpringApplicationBannerPrinter.getImageBanner()
SpringApplicationBannerPrinter.getTextBanner()
//獲取Text類型的banner private Banner getTextBanner(Environment environment) { //先從spring.banner.location路徑中去取,如果沒有,默認(rèn)banner.txt String location = environment.getProperty("spring.banner.location", "banner.txt"); Resource resource = this.resourceLoader.getResource(location); try { if (resource.exists() && !resource.getURL().toExternalForm().contains("liquibase-core")) { return new ResourceBanner(resource); } } catch (IOException var5) {} return null; } //獲取image類型的banner private Banner getImageBanner(Environment environment) { String location = environment.getProperty("spring.banner.image.location"); if (StringUtils.hasLength(location)) { Resource resource = this.resourceLoader.getResource(location); return resource.exists() ? new ImageBanner(resource) : null; } else { String[] var3 = IMAGE_EXTENSION; int var4 = var3.length; for(int var5 = 0; var5 < var4; ++var5) { String ext = var3[var5]; Resource resource = this.resourceLoader.getResource("banner." + ext); if (resource.exists()) { return new ImageBanner(resource); } } return null; } }
基于圖片的 banner
- 可通過配置參數(shù) spring.banner.image.location 來指定
- 可將名為 “banner.jpg” (哪幾種類型取決于ext常量的定義) 的文件放在classpath 目錄(src/main/resources)
基于文件的 banner
- 可通過配置參數(shù) spring.banner.location 來指定
- 可將名為 “banner.txt” 的文件放在 classpath 目錄(src/main/resources)
源碼分析完畢,那么如何去自定義呢?
第一種:配置方式(直接在properties或yml文件中進(jìn)行配置)
即配置 spring.banner.image.location 和 spring.banner.location路徑
或者
將 “圖片” 和 “banner.txt” 放在classpath 目錄中
spring.banner.location=classpath:banner1.png spring.banner.image.margin=2 spring.banner.image.height=76 spring.banner.charset=UTF-8 spring.banner.image.invert=false spring.banner.image.location=banner1.png spring.main.banner-mode=console spring.main.show-banner=true
第二種:自定義banner
import org.springframework.boot.Banner; import org.springframework.boot.ansi.AnsiColor; import org.springframework.boot.ansi.AnsiOutput; import org.springframework.boot.ansi.AnsiStyle; import org.springframework.core.env.Environment; import java.io.PrintStream; /** 自定義banner類 * @author hb * @date 2021-09-09 10:39 */ public class MyBanner implements Banner { private static final String[] BANNER = new String[]{"", " . ____ _ __ _ _", " /\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\", "( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\", " \\\\/ ___)| |_)| | | | | || (_| | ) ) ) )", " ' |____| .__|_| |_|_| |_\\__, | / / / /", " =========|_|==============|___/=/_/_/_/"}; public MyBanner() { } @Override public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) { String[] bannerArray = BANNER; int bannerLength = bannerArray.length; for(int i = 0; i < bannerLength; ++i) { String line = bannerArray[i]; out.println(line); } out.println(AnsiOutput.toString(new Object[]{AnsiColor.GREEN, " :: Spring Boot :: ", AnsiColor.DEFAULT, AnsiStyle.FAINT})); out.println(); } }
如何使用自定義Banner?
springboot啟動類中添加自定義banner
@SpringBootApplication public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(Application.class); //添加自定義banner springApplication.setBanner(new MyBanner()); springApplication.run(args); } }
如果不想打印banner,可以在啟動類的main中,設(shè)置 springApplication.setBannerMode(Banner.Mode.OFF);
或者
通過參數(shù)配置spring.main.banner-mode=off來關(guān)閉banner的打印
3、控制banner樣式
Spring提供了三個(gè)枚舉類來設(shè)定字符的顏色,分別是:
AnsiColor: 用來設(shè)定字符的前景色 AnsiBackground: 用來設(shè)定字符的背景色 AnsiStyle: 用來控制加粗、斜體、下劃線等等。
4、顯示應(yīng)用信息
除了上面的指定樣式之外,還可以顯示一些與應(yīng)用相關(guān)的版本信息:
${application.version} 與 MANIFEST.MF文件中相同的版本號,比如1.5.4.RELEASE ${application.formatted-version} 格式化過的版本號就是加個(gè)v然后用括號包起來,比如(v1.5.4.RELEASE) ${application.title} ${spring-boot.version} Spring Boot的版本 ${spring-boot.formatted-version} 格式化過的版本
到此這篇關(guān)于SpringBoot之自定義Banner詳解的文章就介紹到這了,更多相關(guān)SpringBoot之自定義Banner內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟記錄
這篇文章主要給大家介紹了關(guān)于使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟,Spring?MVC是一種基于MVC模式的框架,它是Spring框架的一部分,它提供了一種更簡單和更有效的方式來構(gòu)建Web應(yīng)用程序,需要的朋友可以參考下2024-05-05Java訪問者模式實(shí)現(xiàn)優(yōu)雅的對象結(jié)構(gòu)處理
Java訪問者模式是一種行為型設(shè)計(jì)模式,它通過將數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作分離,實(shí)現(xiàn)對復(fù)雜對象結(jié)構(gòu)的處理。它將數(shù)據(jù)結(jié)構(gòu)中的每個(gè)元素都轉(zhuǎn)換為訪問者能夠識別的形式,從而使得數(shù)據(jù)操作可以在不影響數(shù)據(jù)結(jié)構(gòu)的前提下進(jìn)行擴(kuò)展和變化2023-04-04SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能
這篇文章主要介紹了SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-02-02java實(shí)現(xiàn)ftp上傳 如何創(chuàng)建文件夾
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)ftp上傳的相關(guān)資料,教大家如何創(chuàng)建文件夾?具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04布隆過濾器(Bloom Filter)的Java實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄悸∵^濾器(Bloom Filter)的Java實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12