spring boot 在应用程序启动时会打印出 banner 信息。spring 是可扩展的,banner 也是能够自由定制的,好比打印出我的的网站信息等,甚至是图片,本文就来探讨一下这个问题。spring
注:本文基于 spring boot 版本 1.5.12.RELEASE。编程
默认,spring boot 会打印出以下内容:源码分析
ASCII Art,显目的单词 spring,附带 spring boot 版本信息。网站
Spring boot 是如何处理的呢?spa
带着问题,咱们来分析源码,定位到 SpringApplication 类的 printBanner 方法,源码以下:日志

代码比较简单,咱们看到打印 banner 的操做委托给了 SpringApplicationBannerPrinter 类,再来看它的源码:code

上述代码,咱们稍加解释:对象
打印 banner 前天然先要获取 Banner 对象blog
打印 banner 的操做实际上由 Banner 自己来完成接口
打印到日志是先由 Banner 将内容输出到内存中拿到打印内容后再委托给 logger 来打印
打印到标准输出是将 System.out 做为参数传入 Banner 对象做为输出目的地
咱们再来看看获取 banner 这段代码:

这段代码大体逻辑:
建立一个 Banners 对象,可组合多个 banner
尝试获取基于图片的 banner
尝试获取基于文本的 banner
前两步操做完成后,若是拿到至少一个 banner 则返回 Banners 对象
前两步操做后都没有获取到 banner,返回自定义的 banner (若是存在)
若自定义 banner 也不存在,返回默认的
注: Banners 也实现了 Banner 接口,运用了组合模式,实际上可同时打印图片和文本 banner。
以上内容就是打印 banner 的大致逻辑,咱们再来看一看细节。
看看基于图片和文本两种形式的 banner 获取源码:
注:为了方便读者阅读,笔者把 spring 定义的常量替换成了原字符串自己

经过这段代码,咱们可得出结论:
基于图片的 banner
可经过配置参数 banner.image.location 来指定
可将名为 banner.jpg (gif|png) 的文件放在 classpath 目录
基于文件的 banner
可经过配置参数 banner.location 来指定
可将名为 banner.txt 的文件放在 classpath 目录
竟然能够打印图片,是否是很好玩,那么咱们就来试一把。
咱们在 classpath 目录下存放一个名为 banner.jpg 的图片,图片以下:
同时也放一个名为 banner.txt 的文件,内容为:
Hello, Spring boot
运行程序,最终咱们看到以下效果:
图片的打印效果是 ASCII 字符画,太好玩了。ASCII 字符画后面紧接着文本文件的内容。
至此,我相信你已经学会如何自定义一个好玩的 banner 了,但咱们的文章还要继续。刚才说的两种方式是基于配置的形式,接下来咱们来讲一下如何基于编程的方式来实现。
既然要经过编程的方式实现,那天然要实现 Banner 接口了,源码以下:

代码也很简单, 只定义了一个 printBanner 方法。
同时还定义了打印模式:
禁用(不打印)
控制台(标准输出)
日志
前面有提到 Banners ,咱们也看一下源码:

Banners 也实现了 Banner 接口,内置一个 Banner 集合,运用了组合模式。
还记得前面提到的 spring 默认 Banner 么,咱们来看一下源码:

是否是很好玩,内置了 ASCII 字符画。
既然咱们要编写本身的 Banner,那么很简单,照葫芦画瓢。
看一下笔者的简单实现:

Banner 实现好了,咱们怎么使它生效呢。很简单,咱们看一下启动类:

咱们再看一下打印效果,以下图:
看到这里,你是否是很想本身实现一个有趣的 banner 呢?
本文中咱们主要讲了如何自定义 Banner,咱们既能够经过配置的方式来指定 banner 文件又可经过编程的方式来实现。