写点什么

SpringBoot 源码 | printBanner 方法解析

  • 2022 年 9 月 08 日
    北京
  • 本文字数:2436 字

    阅读完需:约 8 分钟

SpringBoot源码 | printBanner方法解析

printBanner

printBanner 方法用于打印在 src/main/resources 下名字是 banner 的自定义日志文件信息,对于整体的 SpringBoot 启动流程来说不算主启动业务流程,但是也提供了自定义打印日志内容的可能,有一定存在的意义,所以这里也一起来看一下 printBanner 方法内部吧,printBanner 方法源码加入注释后

private Banner printBanner(ConfigurableEnvironment environment) {    //Disable printing of the banner  是否允许打印banner信息    if (this.bannerMode == Banner.Mode.OFF) {        return null;    }    //资源加载类    ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader            : new DefaultResourceLoader(null);    //构造SpringApplicationBannerPrinter 对象    SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);    //Print the banner to the log file 打印banner到日志文件    if (this.bannerMode == Mode.LOG) {        return bannerPrinter.print(environment, this.mainApplicationClass, logger);    }    //Print the banner to System.out 打印banner到System.out    return bannerPrinter.print(environment, this.mainApplicationClass, System.out);}
复制代码

整个方法比较简单,也比较容易理解,根据我在源码中添加的注释理解即可,这里我们主要看 bannerPrinter.print 方法

bannerPrinter.print

首先来看一下 print 方法的源码

源码先获取 Banner 对象,然后返回 PrintedBanner 对象给调用方

getBanner

getBanner 根据 environment 获取 Banner 对象

这里在获取 Banner 对象的时候会涉及到 getImageBanner、getTextBanner 方法,返回 ImageBanner 或者 ResourceBanner

getImageBanner

getImageBanner 首先会去判断是否配置了 banner 路径信息,后面根据 resourceLoader 获取 banner 是图片相关后缀时返回 ImageBanner 对象

private Banner getImageBanner(Environment environment) {    //获取配置的spring.banner.image.location路径,如果存在则加载资源    String location = environment.getProperty(BANNER_IMAGE_LOCATION_PROPERTY);    if (StringUtils.hasLength(location)) {        Resource resource = this.resourceLoader.getResource(location);        return resource.exists() ? new ImageBanner(resource) : null;    }    //判断是否是IMAGE_EXTENSION = { "gif", "jpg", "png" }后缀,是则返回ImageBanner    for (String ext : IMAGE_EXTENSION) {        Resource resource = this.resourceLoader.getResource("banner." + ext);        if (resource.exists()) {            return new ImageBanner(resource);        }    }    return null;}
复制代码

getTextBanner

getTextBanner 加载默认配置路径的 banner.txt 文件并判断存在性和不包含特定条件,满足则返回 ResourceBanner

private Banner getTextBanner(Environment environment) {    //获取资源配置spring.banner.location默认文件名banner.txt的资源路径    String location = environment.getProperty(BANNER_LOCATION_PROPERTY, DEFAULT_BANNER_LOCATION);    //加载资源    Resource resource = this.resourceLoader.getResource(location);    try {        //如果资源存在且resource的URL不包含liquibase-core则返回ResourceBanner        if (resource.exists() && !resource.getURL().toExternalForm().contains("liquibase-core")) {            return new ResourceBanner(resource);        }    }    catch (IOException ex) {        // Ignore    }    return null;}
复制代码

如此便获取到 Banner,回到 print 方法打印 banner.txt 文本内容

通过构造方法返回 PrintedBanner 用于后续打印日志信息输出

其中构造方法中参数 sourceClass 是主程序类

到这里整个 printBanner 的加载就完成了,结果如图

banner.txt 文本内容为

Application Version: ${ruoyi.version}Spring Boot Version: ${spring-boot.version}//////////////////////////////////////////////////////////////////////                          _ooOoo_                               ////                         o8888888o                              ////                         88" . "88                              ////                         (| ^_^ |)                              ////                         O\  =  /O                              ////                      ____/`---'\____                           ////                    .'  \\|     |//  `.                         ////                   /  \\|||  :  |||//  \                        ////                  /  _||||| -:- |||||-  \                       ////                  |   | \\\  -  /// |   |                       ////                  | \_|  ''\---/''  |   |                       ////                  \  .-\__  `-`  ___/-. /                       ////                ___`. .'  /--.--\  `. . ___                     ////              ."" '<  `.___\_<|>_/___.'  >'"".                  ////            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 ////            \  \ `-.   \_ __\ /__ _/   .-` /  /                 ////      ========`-.____`-.___\_____/___.-`____.-'========         ////                           `=---='                              ////      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        ////             打印banner日志信息                                  //////////////////////////////////////////////////////////////////////
复制代码


发布于: 刚刚阅读数: 7
用户头像

让技术不再枯燥,让每一位技术人爱上技术 2022.07.22 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot源码 | printBanner方法解析_源码_六月的雨在infoQ_InfoQ写作社区