前言
在SpringBoot启动时,会在控制台看到一个Spring Banner输出,本文主要讲解一下配置Banner的几种方式,以及最后从源码的角度进行原理分析。
几种Banner的实现方式
默认Banner
SpringBoot默认就有一个内置的Banner,效果如图显示
文本Banner
如果需要将Banner换成别的文本,那么替换方式非常简单,只需要在resources
文件夹下新建banner.txt
即可。banner.txt
内容如下
ruby
Spring Boot Version: ${spring-boot.version}
////////////////////////////////////////////////////////////////////
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'____ //
// .' \| |// `. //
// / \||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\ - /// | | //
// | _| ''---/'' | | //
// \ .-__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.____<|>_/___.' >'"". //
// | | : `- `.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. _ __\ /__ _/ .-` / / //
// ========`-.____`-.________/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
////////////////////////////////////////////////////////////////////
重启后banner发生变化
除了新建banner.txt
外,也可以是别的txt文件,只不过需要在application.yml
中稍作配置。
把banner.txt
重命名为new-banner.txt
,然后在application.yml
中添加如下配置
yaml
spring:
banner:
location: new-banner.txt # 指定banner位置
图片Banner
除了txt文件外,图片同样也可以作为banner进行输出 这里使用Google的图片,将其复制放到resources
文件夹下,并重名名为banner.png
然后application.yml
配置如下
yaml
spring:
banner:
image:
location: banner.png
# width: 120 可以设置宽度
# height: 80 可以设置高度
启动输出如下
Tips:SpringBoot 支持 gif,jpg,png三种格式作为图片banner
兜底banner
application.yml
配置稍作调整
yaml
spring:
banner:
location: banner123.png # resource文件夹下并没有这个文件
SpringApplication
启动时指定banner
less
@Slf4j
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
// 设置banner,该banner将会作为一个兜底存在,比如application.yml中配置的banner并不存在时,则会尝试输出这里设置的banner
application.setBanner(new ResourceBanner(new ClassPathResource("banner.png")));
application.run(args);
}
}
启动后输出如下,兜底Banner设置成功
Tips:若既设置了兜底Banner,同时application.yml中设置的banner文件也存在,那么启动SpringApplication将会输出两个banner。
关闭Banner
关闭banner的方式也很简单,只需要在application.yml
中做如下配置
yaml
spring:
main:
banner-mode: off # 关闭banner
可以看到启动后不再输出banner
源码解析
printBanner()
启动SpringApplication
,深入run()
方法,可以看到调用了printBanner()
方法
整体逻辑非常简单
- 判断当前是否需要输出banner,不需要则直接返回
- 通过资源加载器获取banner
- 声明banner打印类
- 打印输出banner
SpringApplicationBannerPrinter
该类作用就是用来打印banner
从它的一些字段也可以看出为什么默认banner名称需要是banner.txt
?为什么通过在application.yml
配置spring.banner.location
指定banner?
因为SpringApplicationBannerPrinter
中相关字段的值就是这么固定好的。
print()方法
print()
方法非常简单,就是获取banner
,然后进行打印输出,并返回PrintedBanner
getBanner()
getBanner()
方法也非常简单,从当前Environment
环境中获取文本或者图片相关的Banner并返回,若获取不到任何banner,再判断 fallbackBanner
(兜底banner)是否为空,不为空则返回兜底banner。否则返回默认的banner,也就是输出SpringBoot。
SpringBootBanner
默认的SpringBoot Banner输出是交由SpringBootBanner
实现的
总结
本文相比于之前的几篇原理分析 《SpringBoot ApplicationContextInitializer系统初始化器原理解析》 《SpringBoot ApplicationListener原理解析》 难度会简单很多,总是写复杂且有深度的,偶尔也想写写简单一点的。
结尾
本文章源自《Learn SpringBoot》专栏,感兴趣的话还请关注点赞收藏.