共计 3782 个字符,预计需要花费 10 分钟才能阅读完成。
←←←←←←←←←←←← 快!点关注
SpringBoot 项目启动时会在控制台打印一个默认的启动图案,这个图案就是我们要讲的 banner。看似简单的 banner,我们能够对它做些什么呢?本篇文章就带大家深入了解一下 banner 的使用(版本:SpringBoot2.1.4)。
制作自己的 banner
第一步:在 src/main/resources 下面创建 banner.txt。
第二步:访问网站 http://patorjk.com/software/taag,在网站“Type Something”处输入想要制作的单词(比如:Hello World),会生成对应的字符。也可以通过其他参数来调整字符的样式。
复制生成的字符,粘贴到 banner.txt,再次启动程序便可以打印出指定的 banner 了。
个人比较喜欢的 banner 是如下图形:
${AnsiColor.BRIGHT_YELLOW}
////////////////////////////////////////////////////////////////////
// _ooOoo_ //
// o8888888o //
// 88″ . “88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`—‘\____ //
// .’ \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ – /// | | //
// | \_| ”\—/” | | //
// \ .-\__ `-` ___/-. / //
// ___`. .’ /–.–\ `. . ___ //
// .”” ‘< `.___\_<|>_/___.’ >'””. //
// | | : `- \`.;`\ _ /`;.`/ – ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-‘======== //
// `=—=’ //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无 BUG //
////////////////////////////////////////////////////////////////////
在新版本的 SpringBoot 中,支持了 gif、jpg 和 png 的图片形式的 banner 打印。当然,并不会把图片直接打印在控制台,而是将其像素解析转换成 assii 编码之后打印。
对于 gif 动图,会把动图的每个图片都打印出来,如果动图比较大,打印时间较长。可以尝试一下,但建议不要使用 gif。
在 banner.txt 中,还可以进行一些设置,比如上图中的
${AnsiColor.BRIGHT_YELLOW}。
${AnsiColor.BRIGHT_RED}:设置控制台中输出内容的颜色
${application.version}:用来获取 MANIFEST.MF 文件中的版本号
${application.formatted-version}:格式化后的 ${application.version} 版本信息
${spring-boot.version}:Spring Boot 的版本号
${spring-boot.formatted-version}:格式化后的 ${spring-boot.version} 版本信息
Banner 接口
在未指定 banner.txt 或 banner 图片时,默认图形存储在哪里了呢?下面我们了解一下 Banner 接口。
@FunctionalInterface
public interface Banner {
// 打印 banner
void printBanner(Environment environment, Class<?> sourceClass, PrintStream out);
enum Mode {
// 关闭
OFF,
// 控制台
CONSOLE,
// 日志文件
LOG
}
}
在 banner 接口中提供了打印 banner 的方法和一个枚举类。枚举类有三个值:OFF、CONSOLE、LOG,用来控制 banner 的打印,分别对应:关闭打印、控制台打印和日志打印。
banner 接口的实现主要有 ResourceBanner、ImageBanner、SpringBootBanner 和其他内部类的实现。其中上面看到的图形的打印就来自于 SpringBootBanner。看一下源代码:
class SpringBootBanner implements Banner {
private static final String[] BANNER = { “”,
” . ____ _ __ _ _”,
” /\\\\ / ___’_ __ _ _(_)_ __ __ _ \\ \\ \\ \\”,
“(()\\___ | ‘_ | ‘_| | ‘_ \\/ _` | \\ \\ \\ \\”,
” \\\\/ ___)| |_)| | | | | || (_| |) ) ) )”,
” ‘ |____| .__|_| |_|_| |_\\__, | / / / /”,
” =========|_|==============|___/=/_/_/_/” };
private static final String SPRING_BOOT = ” :: Spring Boot :: “;
private static final int STRAP_LINE_SIZE = 42;
@Override
public void printBanner(Environment environment, Class<?> sourceClass,
PrintStream printStream) {
for (String line : BANNER) {
printStream.println(line);
}
String version = SpringBootVersion.getVersion();
version = (version != null) ? ” (v” + version + “)” : “”;
StringBuilder padding = new StringBuilder();
while (padding.length() < STRAP_LINE_SIZE
– (version.length() + SPRING_BOOT.length())) {
padding.append(” “);
}
printStream.println(AnsiOutput.toString(AnsiColor.GREEN, SPRING_BOOT,
AnsiColor.DEFAULT, padding.toString(), AnsiStyle.FAINT, version));
printStream.println();
}
}
在 printBanner 的方法实现中,首先打印了默认的 Banner 字符串数组,然后将 SPRING_BOOT 和版本信息进行拼接打印。
Banner 的参数设置
banner 的参数设定可以通过两种形式,一种是代码的形式,一种是配置文件的形式。
使用代码的形式首先要将默认的 main 方法进行改造,手动创建 SpringApplication 对象,然后设置相应的参数。示例代码:
public static void main(String[] args) {
SpringApplication app = new SpringApplication(SpringbootBannerApplication.class);
app.setBannerMode(Banner.Mode.CONSOLE);
Banner banner = new ImageBanner(new ClassPathResource(“banner1.png”));
app.setBanner(banner);
app.run(args);
}
通过配置文件设置就比较简单,直接在 application.properties 中进行配置,springboot 已经帮我们预制好了相应的参数。
spring.banner.location=classpath:banner1.png
spring.banner.image.margin=2
spring.banner.image.height=76
spring.banner.charset=UTF-8
spring.banner.image.invert=false
spring.banner.image.location=banner1.png
spring.main.banner-mode=console
spring.main.show-banner=true
其中 spring.main.show-banner 来控制是否打印 banner,在新版本中不建议使用,可以使用 spring.main.banner-mode 代替,将其值设置为 OFF 即可关闭 banner 的打印。
引入文本 banner 通过 spring.banner.location 来指定,引入图片相关的 banner 需要通过 spring.banner.image.location 来指定路径,否则会出现乱码情况。
如果不想显示 banner,可以在代码中通过 setBannerMode(Banner.Mode.OFF) 方法或通过参数配置 spring.main.banner-mode=off 来关闭 banner 的打印。上面示例中已经有所展示。