SpringBoot源码 | printBanner方法解析

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 本文主要讲述SpringBoot启动流程源码中的printBanner()方法

printBanner

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

privateBannerprintBanner(ConfigurableEnvironmentenvironment) {
//Disable printing of the banner  是否允许打印banner信息if (this.bannerMode==Banner.Mode.OFF) {
returnnull;
    }
//资源加载类ResourceLoaderresourceLoader= (this.resourceLoader!=null) ?this.resourceLoader            : newDefaultResourceLoader(null);
//构造SpringApplicationBannerPrinter 对象SpringApplicationBannerPrinterbannerPrinter=newSpringApplicationBannerPrinter(resourceLoader, this.banner);
//Print the banner to the log file 打印banner到日志文件if (this.bannerMode==Mode.LOG) {
returnbannerPrinter.print(environment, this.mainApplicationClass, logger);
    }
//Print the banner to System.out 打印banner到System.outreturnbannerPrinter.print(environment, this.mainApplicationClass, System.out);
}

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

bannerPrinter.print

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

image.png

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

getBanner

getBanner根据environment获取Banner对象

image.png

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

getImageBanner

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

privateBannergetImageBanner(Environmentenvironment) {
//获取配置的spring.banner.image.location路径,如果存在则加载资源Stringlocation=environment.getProperty(BANNER_IMAGE_LOCATION_PROPERTY);
if (StringUtils.hasLength(location)) {
Resourceresource=this.resourceLoader.getResource(location);
returnresource.exists() ?newImageBanner(resource) : null;
    }
//判断是否是IMAGE_EXTENSION = { "gif", "jpg", "png" }后缀,是则返回ImageBannerfor (Stringext : IMAGE_EXTENSION) {
Resourceresource=this.resourceLoader.getResource("banner."+ext);
if (resource.exists()) {
returnnewImageBanner(resource);
        }
    }
returnnull;
}

getTextBanner

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

privateBannergetTextBanner(Environmentenvironment) {
//获取资源配置spring.banner.location默认文件名banner.txt的资源路径Stringlocation=environment.getProperty(BANNER_LOCATION_PROPERTY, DEFAULT_BANNER_LOCATION);
//加载资源Resourceresource=this.resourceLoader.getResource(location);
try {
//如果资源存在且resource的URL不包含liquibase-core则返回ResourceBannerif (resource.exists() &&!resource.getURL().toExternalForm().contains("liquibase-core")) {
returnnewResourceBanner(resource);
        }
    }
catch (IOExceptionex) {
// Ignore    }
returnnull;
}

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

image.png

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

image.png

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

image.png

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


image.png

banner.txt文本内容为

ApplicationVersion: ${ruoyi.version}
SpringBootVersion: ${spring-boot.version}
//////////////////////////////////////////////////////////////////////                          _ooOoo_                               ////                         o8888888o                              ////                         88" . "88                              ////                         (| ^_^ |)                              ////                         O\  =  /O                              ////                      ____/`---'\____                           ////                    .'  \\|     |//  `.                         ////                   /  \\|||  :  |||//  \                        ////                  /  _||||| -:- |||||-  \                       ////                  |   | \\\  -  /// |   |                       ////                  | \_|  ''\---/''  |   |                       ////                  \  .-\__  `-`  ___/-. /                       ////                ___`. .'  /--.--\  `. . ___                     ////              ."" '<  `.___\_<|>_/___.'  >'"".                  ////            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 ////            \  \ `-.   \_ __\ /__ _/   .-` /  /                 ////      ========`-.____`-.___\_____/___.-`____.-'========         ////                           `=---='                              ////      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        ////             打印banner日志信息                                  //////////////////////////////////////////////////////////////////////
相关文章
|
14天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
18天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
14天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
160 37
|
6天前
|
编解码 开发工具 UED
QT Widgets模块源码解析与实践
【9月更文挑战第20天】Qt Widgets 模块是 Qt 开发中至关重要的部分,提供了丰富的 GUI 组件,如按钮、文本框等,并支持布局管理、事件处理和窗口管理。这些组件基于信号与槽机制,实现灵活交互。通过对源码的解析及实践应用,可深入了解其类结构、布局管理和事件处理机制,掌握创建复杂 UI 界面的方法,提升开发效率和用户体验。
48 12
|
3天前
|
Java 应用服务中间件 Spring
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
|
3天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
3天前
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
27 1
|
1天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
10 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
2天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
15 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
2天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
13 3
基于Java+Springboot+Vue开发的美容预约管理系统

热门文章

最新文章

推荐镜像

更多