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日志信息 //
////////////////////////////////////////////////////////////////////
复制代码
评论