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

熟悉的banner,这是springboot的默认banner,对于项目来说有可以,没有也可以,也可以自己定制,权当无聊玩玩~

自定义banner

官方提供了以下解决方案:

  • 通过banner.txt来自定义
  • 通过添加图片banner.gifbanner.jpg, banner.png
  • 编程的方式SpringApplication.setBanner(…​)
  • 将该文件放在类路径下即可(可以直接放在/resource/下面),也可以通过配置文件的spring.banner.location属性来进行定位
  • 如果文件编码不是utf8,可以通过spring.banner.charset进行自定义设置
  • springboot为我们提供了banner参数的占位符
    • ${application.version} 应用版本号
    • ${application.formatted-version} 格式化应用版本号,如(v1.0)
    • ${spring-boot.version} springboot的版本号
    • ${spring-boot.formatted-version}
    • ${Ansi.NAME} (or ${AnsiColor.NAME}, ${AnsiBackground.NAME}, ${AnsiStyle.NAME})
    • ${application.title}

也许你按照上面的格式写了,但是最后的输出结果,很有可能只输出了springboot的版本号,这是正常的,其他的都需要有条件输出,具体的参考官网

图片
  • 就是要做一张图片同样放到类路径下即可,同样可以通过spring.banner.image.location来进行定位
  • 必须是banner.gifbanner.jpg, banner.png这三个名称
编程的方式

可以新建一个类实现Banner接口,也可以使用匿名类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AppBanner implements Banner {
public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
out.append("================================\r\n")
.append("------ ")
.append(environment.getProperty("app.name") + "\r\n")
.append(sourceClass.getName() + "\r\n")
.append("================================").println();
}
}

// main函数
SpringApplication app = new SpringApplication(ApplicationBoot.class);
app.setBanner(new AppBanner());
app.run(args);
1
2
3
4
5
6
7
SpringApplication app = new SpringApplication(ApplicationBoot.class);
app.setBanner(new Banner() {
public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
// TODO
}
});
app.run(args);

匿名类与实现类同样都是实现printBanner方法,该方法的三个参数

  • environment 环境变量,可以获取properties或者yml中的key-value值
  • sourceClass 就是SpringApplication配置的class,这里就是ApplicationBoot.class
  • out 就是负责的输出流

    PS:这里需要注意一点,在main函数中的写法,上面的main写法是可行的,
    但是如果改为下面的写法将不会输出,或者就会变成默认输出
    
1
2
3
SpringApplication app = new SpringApplication();
app.setBanner(new AppBanner());
app.run(ApplicationBoot.class, args);

优先级

这么多的定义方式,如果我全部定义了,该显示哪个呢?

  • 首先,图片的优先级最高,如果与banner.txt同时存在会优先显示图片,然后再显示banner.txt。注意,这两个是可以同时显示的
  • 而图片存在三种格式,优先级从高到低为 .gif > .jpg > .png,这三种如果同时存在会安装优先级的顺序显示优先级最高的一张图片,其余的忽略不显示
  • 编程的方式是优先级最弱的,只有在上面两种同时不存在的情况下才会生效

其他设置

  • 关闭banner:有时如果觉得麻烦,又不喜欢spring的logo,那么直接关掉就可以啦
    • SpringApplication.setBannerMode(Banner.Mode.OFF);
    • spring.main.banner-model=off 这里还有一个需要注意的地方就是,如果采用的是.yml的配置文件,直接这样写启动会失败,这可能是yml的问题,需要将off改为’off’即可
  • Banner.Mode的模式
    • CONSOLE 默认模式,输出到控制台
    • LOG 在log中显示
    • OFF 关闭banner
  • 如果同时存在代码设置开启,配置设置关闭两种方式哪种会生效呢?配置的优先级 > 编程,所以…