https://blog.csdn.net/m0_37034294/article/details/80777744
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
实现的方式非常简单,我们只需要在Spring Boot工程的/src/main/resources目录下创建一个banner.txt文件,然后将ASCII字符画复制进去,就能替换默认的banner了。
下面打印一下hello word
${AnsiColor.BRIGHT_GREEN}
.__ .__ .__ .___
| |__ ____ | | | | ____ __ _ _____________ __| _/
| | \_/ __ \| | | | / _ \ \ \/ \/ / _ \_ __ \/ __ |
| Y \ ___/| |_| |_( <_> ) \ ( <_> ) | \/ /_/ |
|___| /\___ >____/____/\____/ \/\_/ \____/|__| \____ |
\/ \/ \/
${AnsiColor.BRIGHT_RED}
Application Version: ${application.version}${application.formatted-version}
Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
从上面的内容中可以看到,还使用了一些属性设置:
- ${AnsiColor.BRIGHT_RED}:设置控制台中输出内容的颜色
- ${application.version}:用来获取MANIFEST.MF文件中的版本号
- ${application.formatted-version}:格式化后的
- ${application.version}版本信息
- ${spring-boot.version}:Spring Boot的版本号
- ${spring-boot.formatted-version}:格式化后的
- ${spring-boot.version}版本信息
生成ASCII字符画的地址
- http://patorjk.com/software/taag
- http://www.network-science.de/ascii/
- http://www.degraeve.com/img2txt.php
简单的说下底层实现
我用的是springboot1.5.13, 其他版本也是大同小异
开发工具是idea(我喜欢直接用idea看源码)
首先打开我们的springboot1.5.13如下图
这里的SpringApplicationBannerPrinter类就是关于在程序启动阶段banner图输出的,我们来看下源码吧!
class SpringApplicationBannerPrinter {
static final String BANNER_LOCATION_PROPERTY = "banner.location";
static final String BANNER_IMAGE_LOCATION_PROPERTY = "banner.image.location";
static final String DEFAULT_BANNER_LOCATION = "banner.txt";
static final String[] IMAGE_EXTENSION = { "gif", "jpg", "png" };
private static final Banner DEFAULT_BANNER = new SpringBootBanner();
private final ResourceLoader resourceLoader;
private final Banner fallbackBanner;
SpringApplicationBannerPrinter(ResourceLoader resourceLoader, Banner fallbackBanner) {
this.resourceLoader = resourceLoader;
this.fallbackBanner = fallbackBanner;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
上面的代码片段截取可以看出默认配置banner图的文件名称是banner.txt默认获取路径是根目录。看到这就应该恍然大悟为什么banner.txt需要放在根目录下了吧。
在来看下他的源码片段是怎么获取输出的
//构造方法
SpringApplicationBannerPrinter(ResourceLoader resourceLoader, Banner fallbackBanner) {
this.resourceLoader = resourceLoader;
this.fallbackBanner = fallbackBanner;
}
//springboot 在启动的时候会调用print输出
public Banner print(Environment environment, Class<?> sourceClass, Log logger) {
Banner banner = getBanner(environment, this.fallbackBanner);
try {
logger.info(createStringFromBanner(banner, environment, sourceClass));
}
catch (UnsupportedEncodingException ex) {
logger.warn("Failed to create String for banner", ex);
}
return new PrintedBanner(banner, sourceClass);
}
//print方法的重载
public Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {
Banner banner = getBanner(environment, this.fallbackBanner);
banner.printBanner(environment, sourceClass, out);
return new PrintedBanner(banner, sourceClass);
}
//获取banner图信息
private Banner getBanner(Environment environment, Banner definedBanner) {
Banners banners = new Banners();
banners.addIfNotNull(getImageBanner(environment));
//获取根目录下的banner.txt文件
banners.addIfNotNull(getTextBanner(environment));
if (banners.hasAtLeastOneBanner()) {
return banners;
}
if (this.fallbackBanner != null) {
return this.fallbackBanner;
}
//如果没设置banner.txt输出默认的banner
return DEFAULT_BANNER;
}
//获取banner.txt
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
上面的源码中我加入了自己的理解注释,有不妥的地方请指正,互相学习是最快的进步方式。(一个banner.txt其实是没有必要深究的,哈哈,但是也能让我们看出一点springboot启动加载的原理)