SpringBoot Banner输出原理解析

前言

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

几种Banner的实现方式

默认Banner

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

文本Banner

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

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

重启后banner发生变化

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

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

yaml 复制代码
spring:
  banner:
    location: new-banner.txt  # 指定banner位置

图片Banner

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

然后application.yml配置如下

yaml 复制代码
spring:
  banner:
    image:
      location: banner.png
      # width: 120 可以设置宽度
      # height: 80 可以设置高度

启动输出如下

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

兜底banner

application.yml配置稍作调整

yaml 复制代码
spring:
  banner:
    location: banner123.png  # resource文件夹下并没有这个文件

SpringApplication启动时指定banner

less 复制代码
@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设置成功

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

关闭Banner

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

yaml 复制代码
spring:
  main:
    banner-mode: off # 关闭banner

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

源码解析

printBanner()

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

整体逻辑非常简单

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

SpringApplicationBannerPrinter

该类作用就是用来打印banner

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

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

print()方法

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

getBanner()

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

SpringBootBanner

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

总结

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

结尾

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

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

相关推荐
不见长安见晨雾26 分钟前
将Java程序打包成EXE程序
java·开发语言
逸狼1 小时前
【JavaEE初阶】多线程(5 单例模式 \ 阻塞队列)
java·开发语言
Flying_Fish_roe1 小时前
Spring Boot-RESTful API相关问题
spring boot·python·restful
希忘auto2 小时前
Java之线程篇四
java
蓝黑20202 小时前
Java知识点小结3:内存回收
java·gc
Yz98762 小时前
Hadoop里面MapReduce的序列化与Java序列化比较
java·大数据·jvm·hadoop·分布式·mapreduce·big data
凯哥Java2 小时前
优化批处理流程:自定义BatchProcessorUtils的设计与应用
java·数据库·mysql
拉玛干2 小时前
社团周报系统可行性研究-web后端框架对比-springboot,django,gin
数据库·python·spring·golang
njnu@liyong2 小时前
AOP-前置原理-怎么判断和拦截?
java·aop·拦截
末央&3 小时前
【C++】内存管理
java·开发语言·c++