当一个SpringBoot程序运行时,首先会在控制窗口中产生一个图片一样的图案
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: v2.6.7
在个样子的图形其实是可以换的,那么应该如何置换呢?
一、定制Banner
springboot为我们提供了两种方法:
1、在resource文件夹下,添加一个banner.txt的文件,就行了,然后你可以在其中定制你想要的样式
2、通过在配置文件中配置
spring.banner.location=static/banner.txt
二、原理分析
1、在主启动程序中,run方法中会为我们加载Banner信息
public ConfigurableApplicationContext run(String... args) {
.................省略.......................
Banner printedBanner = printBanner(environment);
.................省略.......................
}
2、调用printBanner方法
private Banner printBanner(ConfigurableEnvironment environment) {
//首先会判断是否开启了该功能,若没开启,就会返回null
if (this.bannerMode == Banner.Mode.OFF) {
return null;
}
ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader
: new DefaultResourceLoader(null);
SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);
if (this.bannerMode == Mode.LOG) {
return bannerPrinter.print(environment, this.mainApplicationClass, logger);
}
//这里是向控制台输出的主要方法
return bannerPrinter.print(environment, this.mainApplicationClass, System.out);
}
3、扫描包中的信息,获取banner内容
private Banner getBanner(Environment environment) {
Banners banners = new Banners();
//获取图形类banner的信息
banners.addIfNotNull(getImageBanner(environment));
//获取文本类banner的信息
banners.addIfNotNull(getTextBanner(environment));
if (banners.hasAtLeastOneBanner()) {
return banners;
}
if (this.fallbackBanner != null) {
return this.fallbackBanner;
}
//若不存在,则会返回默认的
return DEFAULT_BANNER;
}
就以文本类的来举例
private Banner getTextBanner(Environment environment) {
String location = environment.getProperty(BANNER_LOCATION_PROPERTY, DEFAULT_BANNER_LOCATION);
Resource resource = this.resourceLoader.getResource(location);
try {
if (resource.exists() && !resource.getURL().toExternalForm().contains("liquibase-core")) {
return new ResourceBanner(resource);
}
}
catch (IOException ex) {
// Ignore
}
return null;
}
由该类可以发现,会依次进行扫描,若在配置文件中配置了spring.banner.location的信息,则会返回banner.txt配置的路径
反之,就会返回DEFAULT_BANNER_LOCATION,然后通过资源加载器来获取该类资源。