Spring Boot-8-Banner解析

上文中,分析了Spring容器的 refresh 流程,还有 Bean 的实例化流程,本文来了解一下 Spring Boot 中的 Banner 的解析,还有他的原理

自定义Banner

Spring Boot 默认的 Banner 图如下:

1
2
3
4
5
6
7
   .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.4.RELEASE)

这里就是一个 Spring 的字符画,加上Spring Boot的版本号, 我们可以把这个图换成我们自定义的一些文字或者图片

文字Banner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//                       .::::.
// .::::::::.
// :::::::::::
// ..:::::::::::'
// '::::::::::::'
// .::::::::::
// '::::::::::::::..
// ..::::::::::::.
// ``::::::::::::::::
// ::::``:::::::::' .:::.
// ::::' ':::::' .::::::::.
// .::::' :::: .:::::::'::::.
// .:::' ::::: .:::::::::' ':::::.
// .::' :::::.:::::::::' ':::::.
// .::' ::::::::::::::' ``::::.
// ...::: ::::::::::::' ``::.
// ````':. ':::::::::' ::::..
// '.:::::' ':'````..
//

比如我们要在项目中,把Banner换成上面这个,只需要在项目的 Resource 目录下新建一个 Banner.txt , 然后复制进去就可以了

这里名称默认的就是 Banner.txt, 如果名称不是这个的话, 比如是 MyBanner.txt ,就需要在 application 配置文件中做以下设置

1
2
3
spring:
banner:
location: MyBanner.txt

图片banner

Spring Boot 支持 gif,jpg,png 这三种格式的图片banner, 打印的时候会将图片转换成一些字符画来输出, 设置方法和文字的banner的是一样的,默认的图片名称也是 Banner ,然后如果名称不是默认名称的话,也是通过修改 application 配置文件指定,配置如下:

1
2
3
4
spring:
banner:
image:
location: xxx.jpg

对于图片banner,还有一些其他的设置,比如图片的长宽等,都是通过 spring.banner.image.* 来配置的

兜底banner

兜底banner,就是上面两种方式都找不到的情况下,会输出的,这个需要通过硬编码的方式设置, 修改项目启动类,如下:

1
2
3
4
5
6
7
8
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(App.class);
springApplication.setBanner(new ResourceBanner(new ClassPathResource(",MyBanner.txt")));
springApplication.run(args);
}
}

这里通过 springApplication.setBanner() 这个方法去设置

关闭banner

如果不想输出任何的banner,也可以通过配置关闭, application 配置文件中配置如下:

1
2
3
spring:
main:
banner-mode: off

这里可以配置的值,一共是三种:

  • off: 关闭banner
  • console: 控制台打印
  • log: 打印到日志文件

banner解析原理

了解了如何替换banner之后,来了解以下他的原理,banner是如何被 Spring Boot 识别并且打印的

首先进入run方法,找到打印banner的方法,如下:

image

点进去

image

这里不管是log方式还是console的方式,调用的方法其实都是一样的,只是传入的参数不一样,继续点进去往下看

image

这里分为两步,先获取,然后打印

获取Banner

进入 getBanner() 方法,如下:
image

然后图片和文字banner的获取如下:

image

打印Banner

上面一步,获取到banner之后,就调用他的打印方法
image

这里可能获取到的是我们配置的banner,也可能是 Spring Boot 的默认的banner,也就是 SpringBootBanner 这个类,先来看一下默认的,点进去

image

然后进入默认的 SpringBootBanner

image

然后再来看一下文字类型的 banner 的打印, 进入 ResourceBanner 如下:

image

最后是图片类型的 banner ,进入 ImageBanner

image

总结

到这儿,就了解了banner的自定义配置,以及他们是如何被解析出来并打印的,这部分比较简单,用处其实也不大,大致了解了就可以了