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:關閉,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) {
//調用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()) {
// 如果至少有一個,則返回
// Banners 也實現(xiàn)了 Banner 接口,運用了組合模式,實際上可同時打印圖片和文本 banner。
return banners;
} else {
// 返回自定義的banner(this.fallbackBanner) 或者 springboot默認的banner(DEFAULT_BANNER)
// 默認的banner類:SpringBootBanner。
// 自定義的banner:需要我們仿照SpringBootBanner去自定義一個類
//this.fallbackBanner: 表示自定義的banner,此參數(shù)可在springboot啟動類的main方法中設置,后續(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,如果至少有一個,則執(zhí)行該banner,如果沒有,返回自定義的banner,如果自定義也沒有,則返回默認
那么上述源碼中是如何獲取image類型和Text類型的banner呢?
SpringApplicationBannerPrinter.getImageBanner()
SpringApplicationBannerPrinter.getTextBanner()
//獲取Text類型的banner
private Banner getTextBanner(Environment environment) {
//先從spring.banner.location路徑中去取,如果沒有,默認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文件中進行配置)
即配置 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中,設置 springApplication.setBannerMode(Banner.Mode.OFF);
或者
通過參數(shù)配置spring.main.banner-mode=off來關閉banner的打印
3、控制banner樣式
Spring提供了三個枚舉類來設定字符的顏色,分別是:
AnsiColor: 用來設定字符的前景色 AnsiBackground: 用來設定字符的背景色 AnsiStyle: 用來控制加粗、斜體、下劃線等等。
4、顯示應用信息
除了上面的指定樣式之外,還可以顯示一些與應用相關的版本信息:
${application.version} 與 MANIFEST.MF文件中相同的版本號,比如1.5.4.RELEASE
${application.formatted-version} 格式化過的版本號就是加個v然后用括號包起來,比如(v1.5.4.RELEASE)
${application.title}
${spring-boot.version} Spring Boot的版本
${spring-boot.formatted-version} 格式化過的版本
到此這篇關于SpringBoot之自定義Banner詳解的文章就介紹到這了,更多相關SpringBoot之自定義Banner內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JDK動態(tài)代理接口和接口實現(xiàn)類深入詳解
這篇文章主要介紹了JDK動態(tài)代理接口和接口實現(xiàn)類,JDK動態(tài)代理是代理模式的一種實現(xiàn)方式,因為它是基于接口來做代理的,所以也常被稱為接口代理,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-06-06
SpringBoot實現(xiàn)websocket服務端及客戶端的詳細過程
文章介紹了WebSocket通信過程、服務端和客戶端的實現(xiàn),以及可能遇到的問題及解決方案,感興趣的朋友一起看看吧2024-12-12
IDEA的Swing可視化插件JFormDesigner詳解
JFormDesigner是一個專業(yè)的軟件應用程序,專門用于幫助您開發(fā)Java?Swing用戶界面,而無需具備編程技能。它可作為獨立實用程序使用,也可以將其用作各種IDE的插件,本文給大家介紹idea?Swing可視化插件,感興趣的朋友一起看看吧2022-06-06

