SpringBoot启动控制台的banner是怎么回事


SpringBoot启动控制台的banner是怎么回事

文章插图
 
前言
每次启动SpringBoot项目时,总是能看到控制台打印了一串字符,隐约能辨认出是“Spring”,不知大家是否也好奇过是怎么实现的,是直接打印固定的字符串,还是根据什么算法去生成的?于是闲暇无事,探究一番 。
SpringBoot启动控制台的banner是怎么回事

文章插图
 
 
只想修改banner可以跳到文末查看
SpringBoot是怎么打印的 Banner默认实现类 SpringBootBanner 
1、根据控制台打印的字符进行全局搜索,笔者选取:: Spring Boot ::进行搜索,定位到了org.springframework.boot.SpringBootBanner 。
 
IDEA全局搜索:CTRL + SHIFT + R
 
SpringBoot启动控制台的banner是怎么回事

文章插图
 
2、进入SpringBootBanner类,先看下注释Default Banner implementation which writes the 'Spring' banner.,说了两个信息:1、当前类是SpringBoot Banner的默认实现;2、打印的字符是“Spring” 。
3、往下看,SpringBootBanner实现了Banner接口 。Banner包括printBanner方法和枚举Mode 。
根据Mode中的注释和枚举值可以看出,Banner有三种状态:关闭、打印到控制台、打印到日志 。具体使用场景留待后续分析 。
Banner源码
4、往下看到类的属性BANNER和SPRING_BOOT,也能辨认出是控制台打印的那些字符 。
类里面只有一个方法printBanner,负责打印Banner字符 。逻辑比较清晰,第一部分逐行打印BANNER形成图案;第二部分打印SpringBoot版本号,总长度由STRAP_LINE_SIZE控制 。
SpringBootBanner完整代码 Banner核心控制类 SpringApplicationBannerPrinter
1、上节找到了负责存储和打印Banner字符的类SpringBootBanner,现在向调用链上方继续寻找,通过CTRL + B或者全局搜索可以发现SpringBootBanner在SpringApplicationBannerPrinter类中作为类变量,大概能猜测出这个SpringApplicationBannerPrinter类是Banner打印的核心控制器 。
2、进入SpringApplicationBannerPrinter类,照例先看注释Class used by SpringApplication to print the application banner.,意思是当前类被SpringApplication用来打印banner 。
这个SpringApplication好像有点眼熟,名字和我们SpringBoot项目的启动类有点相似,翻翻启动类的代码,想起我们就是通过SpringApplication的run方法启动项目,banner打印调用也是由SpringApplication控制的,后续会详细分析 。(占坑,后续SpringBoot启动流程也会出一篇博客去探讨一下)
SpringBoot启动控制台的banner是怎么回事

文章插图
 
回归正题,继续从类的属性开始看,根据名字猜测大概含义,留待后续验证:
 
  1. BANNER_LOCATION_PROPERTY:Spring配置,大概是banner文件的路径 。
  2. BANNER_IMAGE_LOCATION_PROPERTY:Spring配置,banner图片的路径(存疑,控制台难道能打印图片?) 。
  3. DEFAULT_BANNER_LOCATION = "banner.txt":取值是txt文件,猜测是banner文件的默认位置 。
  4. String[] IMAGE_EXTENSION = { "gif", "jpg", "png" }:取值是常见图片的后缀,结合第二个属性猜测是用来对banner图片类型做限制 。
  5. DEFAULT_BANNER = new SpringBootBanner():把上节分析的SpringBootBanner当做Banner默认实现类
  6. ResourceLoader resourceLoader:ResourceLoader简单来说是Spring加载资源的统一抽象,由实现类提供具体逻辑 。
    在Spring中读取xml配置文件加载应用上下文的ClassPathXmlApplicationContext,就是ResourceLoader的子类 。
  7. Banner fallbackBanner:翻译过来是回退banner,暂时猜不出作用,等待后续填坑 。 
     
 
3、往下看方法,只有两个非私有方法,都是print的重载方法,差别在于第三个参数,分别是Log logger和PrintStream out,代表这两个方法分别负责日志打印和控制台打印 。


推荐阅读