SpringBoot Banner输出原理解析

2023年 8月 13日 45.7k 0

前言

在SpringBoot启动时,会在控制台看到一个Spring Banner输出,本文主要讲解一下配置Banner的几种方式,以及最后从源码的角度进行原理分析。

几种Banner的实现方式

默认Banner

SpringBoot默认就有一个内置的Banner,效果如图显示

image.png

文本Banner

如果需要将Banner换成别的文本,那么替换方式非常简单,只需要在resources文件夹下新建banner.txt即可。banner.txt内容如下

Spring Boot Version: ${spring-boot.version}
////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O  =  /O                              //
//                      ____/`---'____                           //
//                    .'  |     |//  `.                         //
//                   /  |||  :  |||//                          //
//                  /  _||||| -:- |||||-                         //
//                  |   | \  -  /// |   |                       //
//                  | _|  ''---/''  |   |                       //
//                    .-__  `-`  ___/-. /                       //
//                ___`. .'  /--.--  `. . ___                     //
//              ."" ''"".                  //
//            | | :  `- `.;` _ /`;.`/ - ` : | |                 //
//               `-.   _ __ /__ _/   .-` /  /                 //
//      ========`-.____`-.________/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//             佛祖保佑       永不宕机      永无BUG               //
////////////////////////////////////////////////////////////////////

重启后banner发生变化

image.png

除了新建banner.txt外,也可以是别的txt文件,只不过需要在application.yml中稍作配置。

banner.txt重命名为new-banner.txt,然后在application.yml中添加如下配置

spring:
  banner:
    location: new-banner.txt  # 指定banner位置

图片Banner

除了txt文件外,图片同样也可以作为banner进行输出
这里使用Google的图片,将其复制放到resources文件夹下,并重名名为banner.png

image.png

然后application.yml配置如下

spring:
  banner:
    image:
      location: banner.png
      # width: 120 可以设置宽度
      # height: 80 可以设置高度

启动输出如下

image.png

Tips:SpringBoot 支持 gif,jpg,png三种格式作为图片banner

兜底banner

application.yml配置稍作调整

spring:
  banner:
    location: banner123.png  # resource文件夹下并没有这个文件

SpringApplication启动时指定banner

@Slf4j
@SpringBootApplication
public class Application {

    public static void main(String[] args) {

        SpringApplication application = new SpringApplication(Application.class);
        // 设置banner,该banner将会作为一个兜底存在,比如application.yml中配置的banner并不存在时,则会尝试输出这里设置的banner
        application.setBanner(new ResourceBanner(new ClassPathResource("banner.png")));
        application.run(args);
    }

}

启动后输出如下,兜底Banner设置成功

image.png

Tips:若既设置了兜底Banner,同时application.yml中设置的banner文件也存在,那么启动SpringApplication将会输出两个banner。

关闭Banner

关闭banner的方式也很简单,只需要在application.yml中做如下配置

spring:
  main:
    banner-mode: off # 关闭banner

可以看到启动后不再输出banner

image.png

源码解析

printBanner()

启动SpringApplication,深入run()方法,可以看到调用了printBanner()方法

image.png

整体逻辑非常简单

  • 判断当前是否需要输出banner,不需要则直接返回
  • 通过资源加载器获取banner
  • 声明banner打印类
  • 打印输出banner
  • image.png

    SpringApplicationBannerPrinter

    该类作用就是用来打印banner

    image.png

    从它的一些字段也可以看出为什么默认banner名称需要是banner.txt?为什么通过在application.yml配置spring.banner.location指定banner?

    因为SpringApplicationBannerPrinter中相关字段的值就是这么固定好的。

    image.png

    print()方法

    print()方法非常简单,就是获取banner,然后进行打印输出,并返回PrintedBanner

    SpringBoot Banner输出原理解析-1

    getBanner()

    getBanner()方法也非常简单,从当前Environment环境中获取文本或者图片相关的Banner并返回,若获取不到任何banner,再判断
    fallbackBanner(兜底banner)是否为空,不为空则返回兜底banner。否则返回默认的banner,也就是输出SpringBoot。

    image.png

    SpringBootBanner

    默认的SpringBoot Banner输出是交由SpringBootBanner实现的

    image.png

    总结

    本文相比于之前的几篇原理分析 《SpringBoot ApplicationContextInitializer系统初始化器原理解析》 《SpringBoot ApplicationListener原理解析》 难度会简单很多,总是写复杂且有深度的,偶尔也想写写简单一点的。

    结尾

    本文章源自《Learn SpringBoot》专栏,感兴趣的话还请关注点赞收藏.

    上一篇文章:《SpringBoot ApplicationListener原理解析》

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论