SpringBoot 自定义 Banner

476 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Banner 获取规则

org.springframework.boot.SpringApplicationBannerPrintergetBanner()方法中,定义了 SpringBoot 项目获取 Banner 的逻辑,如下:

该方法返回Banner对象( 实际是个函数式接口 ),Banner 接口有如下几个实现类:

  • Banners 类,内部维护一个 List 对象,并负责循环输出所有 banner 信息。由此可知,SpringBoot 支持设置多个 Banner.
  • ImageBanner 类,读取 image 图片,作为 Banner 输出。这说明,SpringBoot 的 Banner 支持传入图片。
  • ResourceBanner 类,则是读取文字,作为 Banner 输出。
  • SpringBootBanner 类,则是 SpringBoot 项目,默认的 Banner 输出。

1.创建 Banners

实际上就是创建 List 用来存放所有 Banner.

2.获取图片 Banner

进入getImageBanner()方法如下:

先是从BANNER_IMAGE_LOCATION_PROPERTY获取 Banner,有就返回,没有就从 classpath 下获取 banner.gif / banner.jpg / banner.png 图片。

定义了图片 Banner 的位置,只能是 classpath 路径下,否则无法获取。

Banner 图片支持的格式:

图片存在三种格式,优先级从高到低为.gif > .jpg > .png,这三种如果同时存在会安装优先级的顺序显示优先级最高的一张图片.

3.获取文字 Banner

进入getTextBanner(environment)方法如下:

先是从 BANNER_LOCATION_PROPERTY 参数获取,没有则从 DEFAULT_BANNER_LOCATION 获取 banner 文件的名字。加载都是从 classpath 下加载。

4.判断是否存在

如果存在,就返回,不再执行。

5.判断是否有自定义 Banner

判断是否存在自定义的 Banner 实现类 fallbackBanner,如果存在则使用它来打印 banner 图案。

那 fallbackBanner 是哪里来的呢?

fallbackBanner 是 SpringApplicationBannerPrinter 的属性,在实例化时传入。

实例化时是在 SpringApplication 的 printBanner() 中进行的:

this.banner 则是 SpringApplication 的属性,对外提供了 setBanner() 方法,可以用来设置自定义 Banner 类。

6.返回默认 Banner

如果都没有,则返回默认的 Banner.

自定义 Banner 的三种方式

实现 Banner 接口

流程:自定义一个类,实现 Banner 接口,并在启动类中传入。

注意:前面的源码中可以看到,这种方式,要求必须没有 图片 Banner 也没有文字 Banner 才行,否则执行不到这一步。

1.自定义 Banner 类

实现 Banner 接口,重写 printBanner 方法即可。

public class JueJingBanner implements Banner {
    @Override
    public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
        String txt = "\n" +
                "   ___              ___ _             \n" +
                "  |_  |            |_  (_)            \n" +
                "    | |_   _  ___    | |_ _ __   __ _ \n" +
                "    | | | | |/ _ \   | | | '_ \ / _` |\n" +
                "/\__/ / |_| |  __/\__/ / | | | | (_| |\n" +
                "\____/ \__,_|\___\____/|_|_| |_|\__, |\n" +
                "                                 __/ |\n" +
                "                                |___/ \n";
        out.println(txt);
    }
}

2.使用

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        JueJingBanner jueJingBanner = new JueJingBanner();
        app.setBanner(jueJingBanner);
        app.run(args);
    }
}

使用 Banner 图片

配置文件中指定 banner 图片位置,不指定的话,只要 resources下名字叫 banner.gif / banner.jpg / banner.png,默认也能找得到。

spring:
  banner:
    image:
      location: classpath:123.png

使用 Banner 文字

配置文件中指定 banner.txt 位置,不指定的话,只要 resources下名字叫banner.txt,默认也能找得到。

spring:
  banner:
    location: classpath:123.txt

优先级

这么多的定义方式,该如何显示呢?

  • 图片的优先级最高
  • 文字的优先级次之( 图片和文字可以同时存在,同时展示,先图后字 )
  • 自定义 banner 最低,只有在上面两种同时不存在的情况下才会生效
  • 都没有,输出默认 Banner

生成ASCII的在线地址

  • 输入文字生成ASCII:

patorjk.com/software/ta…

  • 搜索关键字获得ASCII:

www.bootschool.net/ascii-art

  • 通过图片生成ASCII:

www.degraeve.com/img2txt.php

关闭 Banner

Banner 有三种输出模式:

  • OFF 不输出
  • CONSOLE 输出到控制台
  • LOG 输出到日志

所以配置文件中如下配置即可关闭:

spring:
  main:
    bannerMode: off