44

原来 Spring Boot Banner 还能这么好玩儿

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzAxMjA0MDk2OA%3D%3D&%3Bmid=2449469495&%3Bidx=1&%3Bsn=9f4ccaaa5062186b6db55a6e3c2e5586
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

3aqIF3Y.png!web

古时的风筝第  69  篇原创文章 

每次启动 Spring Boot 的时候都会在控制台输出以下的一段特殊格式的文本内容。

bqARNbB.png!web

它就像一个图腾一样的摆在那儿,虽然对于程序的正常运行来说没有什么作用,但是每次看到都有一种熟悉、亲切、激动的感觉,因为接下来就是见证奇迹的时刻了。因为当你看到这段内容的时候,要么就是在调试某个功能,要么就是在做线上部署,眼看着辛苦摸鱼(是加班)的付出就要见到成果了,能不激动吗。当然接下来的奇迹有可能是一堆五彩缤纷的错误日志。

BRRnUnA.jpg!web

一般很少有人去碰它,或者说不知道它还可以定制。其实之前我也并不知道,甚至不知道 Spring Boot 给他的定义为 Banner,直到那天我读 Spring Boot 的源码的时候,突然发现这么一行。

Banner printedBanner = printBanner(environment);

大多数人看名字很容易联想到控制台的那段特殊格式的输出,进到里面一看确实没错,就是它。这段默认的内容在 org.springframework.boot.SpringBootBanner 类中。

class SpringBootBanner implements Banner {
private static final String[] BANNER = { "", " .   ____         _           __ _ _",
" /\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\", "( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\",
" \\\\/ ___)| |_)| | | | | || (_| | ) ) ) )", " ' |____| .__|_| |_|_| |_\\__, | / / / /",
" =========|_|==============|___/=/_/_/_/" };
private static final String SPRING_BOOT = " :: Spring Boot :: ";
}

定制 Banner

先来看看我用图片当做 Banner 的输出效果。左边是原图,右边是在 IDEA 控制台的输出样式。看上来是不是有点装 13。

3aqIF3Y.png!web

本着好玩儿的目的我们来看一看如何对 Banner 进行定制。当然了,这对程序本身意义不是很大,如果你在公司这么做了,可能还会被领导批评浪费时间。

什么情况下有可能会定制 Banner 呢,如果不是为了好玩儿,那可能就是当我们对外提供用 Spring Boot 实现的而且是给开发者使用的第三方程序包,比如像 Arthas 这种工具,或者比如我之前做过一个web 版 JVM 监控端这种,直接给开发者使用的包,可以用定制的 Banner 来显得比较高大上,比较有格调。

顺着源码一路跟进来,我发现了下面的关于 Banner 的配置信息,后来发现在官方文档中都写的很清楚了,只是很少有人注意到罢了。(官方核心 properites 说明:https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/reference/html/appendix-application-properties.html#common-application-properties)

spring:
main:
  banner-mode: log
banner:
  location: banner.txt
  image:
    location: banner.png
    bitdepth: 4
    height: 71
    width: 100
    invert: false
    margin: 2
    pixelmode: text
  charset: UTF-8

开关控制

Banner 可以选择性的输出或者关闭,用属性 spring.main.banner-mode 控制,其可选参数值有:

  1. off : 关闭 Banner,当 Spring Boot 启动的时候不输出 Banner

  2. console : 用 System.out 输出 Banner

  3. log : 用 log 的方式输出,默认是 org.apache.commons.logging 方式,如果你安装了比如 Slf4j 门面框架会自动匹配。

文本 Banner 和图片 Banner

Spring Boot 默认的 Banner 就是文字的,通过 spring.banner.charset 设置编码格式,more就是 utf-8。

spring.banner.location 属性配置文本 Banner 的位置,默认是 resources 根目录,比如我前面例子中是 banner.txt,你在 banner.txt 中输入什么内容,到时候项目启动的时候就直接给你输出了。

图片 Banner 配置的参数就多一点,全都在 spring.banner.image 父属性之下,包括

location: banner.png # 图片位置
bitdepth: 4 #颜色位数 有 4 和 8 两个选项,表示16色和256色
height: 71 # 高度,默认不设置,就是图片自身高度
width: 100 #宽度,默认不设置,就是图片自身宽度
invert: false # 控制台暗黑模式下是否反转输出 默认 false
margin: 2 # 边距
pixelmode: text #像素状态 有 text 和 block 两种选项,表示文本和块状显示

下图是我的测试项目中 resources 目录的结构,包括了 banner.txt 和 banner.png。

MbUzYnB.png!web

既有文本 banner 又有图片 banner ,会优先选择哪个格式输出吗?没有,Spring Boot 会将你所有的 banner 都输出。

使用上面的配置运行 Spring Boot,输出的内容如下图,是不是狂拽酷炫。

auANfaV.png!web

尤其来说一下这个输出图片 Banner 的功能,看到上面的原图和输出内容的对比了吗,在这个图片 Banner 的输出逻辑中,会根据原图所在位置的项目颜色值来动态的在对应坐标输出颜色相同的字符,虽然细节看不清楚,但是轮廓还是非常清楚的,比如我这个马里奥就能够很清晰的辨认出来。

各位同学,赶紧将你写的项目 Banner 改一下让你周围的同学眼前一亮吧。

最后

如果不是读源码,我可能永远也不会注意到这个小小的 Banner 其实还藏着这么有趣的秘密。读源码确实枯燥,大多数情况下读一两遍根本连完整流程都串不起来,还有一些细枝末节的地方,很容易导致我们半途而废。但是,就比如 Spring Boot 的 Banner 功能,还是非常有意思的,就等着我们去发现了。这些就是奔向罗马的大道上一朵朵鲜花,让枯燥的路途,也充满风光。

还可以读

看完就懂的 Spring IoC 实现过程

你了解 Spring Boot Starter 吗

公众号:古时的风筝, 一个不只有技术的技术公众号。

我是风筝,一个主业 Java,同时也擅长 Python、React 的斜杠开发者。你可选择现在就关注我,或者看看历史文章再关注也不迟。

技术交流还可以加群或者直接加我微信。

zYVzAjq.jpg!web

【劳动者最好看!】

BBR7riA.png!web

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK