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原理解析

相关推荐
糖拌西红柿多放醋13 分钟前
SpringBoot整合Mybatis-Plus实践汇总
java·spring boot·后端·mybatis
XiaoLeisj26 分钟前
【JavaEE初阶 — 多线程】wait() & notify()
java·开发语言·java-ee
偶尔。5351 小时前
Java Server Pages (JSP):动态网页开发的基石
java·开发语言
一航jason1 小时前
Android Jetpack Compose 现有Java老项目集成使用compose开发
android·java·android jetpack
basic_code1 小时前
Docker部署Kafka集群,增加 SASL_SSL认证,并集成到Spring Boot,无Zookeeper版
spring boot·docker·kafka·kafka集群
小码ssim1 小时前
IntelliJ IDEA 2024.3(Ultimate Edition)免费化教学
java·ide·intellij-idea
qq_429856571 小时前
解决 idea windows 设置maven离线模式之后,maven继续请求远程仓库
java·maven·intellij-idea
ChinaRainbowSea2 小时前
4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明
java·spring boot·后端·spring·spring cloud·ribbon·负载均衡
坟头种朵喇叭花2 小时前
LinkedList与链表
java·数据结构·链表
清酒伴风(面试准备中......)2 小时前
计算机网络HTTP——针对实习面试
java·笔记·网络协议·计算机网络·http·面试·实习