banner(/ˈbænər/) 意思为“横幅、标语”。横幅是 Spring Boot 应用的特色,它在应用每次启动时在控制台打印出一个字符图案,可以显示应用名称、简称以及版本信息。例如:
推荐一个字符图生成网站:http://patorjk.com/software/taag/
通过在 classpath 下添加一个 banner.txt 或在 application.properties / application.yml 配置中设置 banner.location 来指定相应的 banner 文件可以改变启动过程中打印的 banner。如果这个文件有特殊的编码,你可以使用 banner.encoding 设置它(默认为 UTF-8)。除了文本文件,你也可以添加一个 banner.gif ,banner.jpg 或 banner.png 图片,或设置 banner.image.location 属性。图片会转换为字符画(ASCII art)形式,并在所有文本 banner 上方显示。
在 banner.txt 中可以使用如下占位符:
${application.version}:MANIFEST.MF 中声明的应用版本号,例如:Implementation-Version: 1.0 会打印 1.0
${application.formatted-version}:MANIFEST.MF 中声明的被格式化后的应用版本号(被括号包裹且以 v 作为前缀),用于显示,例如:( v1.0 )
${spring-boot.version}:当前Spring Boot的版本号,例如:1.4.1.RELEASE
${spring-boot.formatted-version}:当前 Spring Boot 被格式化后的版本号(被括号包裹且以v作为前缀), 用于显示,例如:(v1.4.1.RELEASE)
${Ansi.NAME} (或 ${AnsiColor.NAME}, ${AnsiBackground.NAME}, ${AnsiStyle.NAME}):NAME 代表一种 ANSI 编码,具体详情查看 AnsiPropertySource
${application.title}:MANIFEST.MF 中声明的应用 title,例如:Implementation-Title: MyApp 会打印 MyApp
注意:
如果想以编程的方式产生一个 banner,可以使用 SpringBootApplication.setBanner(…) 方法,并实现 org.springframework.boot.Banner 接口的 printBanner() 方法。你也可以使用spring.main.banner-mode 属性决定将 banner 打印到何处:
Banner.Mode.OFF:禁止 banner 打印
Banner.Mode.CONSOLE:将 banner 打印到 System.out,即控制台
Banner.Mode.LOG:将 banner 打印到日志文件
用于以编程方式编写 banner 的接口类,该接口仅仅只有一个 printBanner(Environment environment, Class<?> sourceClass, PrintStream out) 方法,用于将 banner 打印到指定的流。其中参数:
environment:Spring Environment 对象,可以从该对象中获取属性值
sourceClass:应用程序的 Class 对象
out:输出打印流
Spring Boot 提供了一下几个 Banner 接口的默认实现:
ImageBanner:该类将图片转换为字符画(ASCII art),然后打印到指定的输出流
SpringBootBanner:该类是 Spring Boot 提供的默认 Banner,当你没有配置任何 Banner 的时候将会执行该类,该类将在控制台输出“Spring Boot”字符串
ResourceBanner:该类实现从 Text 文件读取 Banner 字符串,然后将该字符串打印到输出流
如果你需要自定义 Banner,需要实现 Banner 接口,重写 printBanner() 方法。如下:
import org.springframework.boot.Banner; import org.springframework.core.env.Environment; import java.io.PrintStream; import java.text.SimpleDateFormat; import java.util.Date; /** * 自定义自己的 Banner */ public class MyBanner implements Banner { private static final String[] BANNER = { " _ ___ __ _____ _______ _____ _______ ________", " | | | \\ \\ / // ____|__ __| __ \\|_ _\\ \\ / / ____|", " | |__| |\\ V /| (___ | | | |__) | | | \\ \\ / /| |__", " | __ | > < \\___ \\ | | | _ / | | \\ \\/ / | __|", " | | | |/ . \\ ____) | | | | | \\ \\ _| |_ \\ / | |____", " |_| |_/_/ \\_\\_____/ |_| |_| \\_\\_____| \\/ |______|" }; @Override public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) { for(String line : BANNER) { out.println(line); } // 当前时间 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); out.println("当前时间:" + dateFormat.format(new Date())); out.println("当前JDK版本:" + System.getProperty("java.version")); out.flush(); } }
实现好自己的 Banner 类后,还需要将它设置到 Spring Boot,如下:
import org.springframework.boot.Banner; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; @SpringBootApplication public class SpringbootBannerDemo4Application { public static void main(String[] args) { new SpringApplicationBuilder(SpringbootBannerDemo4Application.class) .banner(new MyBanner()) .bannerMode(Banner.Mode.CONSOLE).run(args); } }