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方法的源码
源码先获取Banner对象,然后返回PrintedBanner对象给调用方
getBanner
getBanner根据environment获取Banner对象
这里在获取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文本内容
通过构造方法返回PrintedBanner用于后续打印日志信息输出
其中构造方法中参数sourceClass是主程序类
到这里整个printBanner的加载就完成了,结果如图
banner.txt文本内容为
ApplicationVersion: ${ruoyi.version} SpringBootVersion: ${spring-boot.version} ////////////////////////////////////////////////////////////////////// _ooOoo_ //// o8888888o //// 88" . "88 //// (| ^_^ |) //// O\ = /O //// ____/`---'\____ //// .' \\| |// `. //// / \\||| : |||// \ //// / _||||| -:- |||||- \ //// | | \\\ - /// | | //// | \_| ''\---/'' | | //// \ .-\__ `-` ___/-. / //// ___`. .' /--.--\ `. . ___ //// ."" '< `.___\_<|>_/___.' >'"". //// | | : `- \`.;`\ _ /`;.`/ - ` : | | //// \ \ `-. \_ __\ /__ _/ .-` / / //// ========`-.____`-.___\_____/___.-`____.-'======== //// `=---=' //// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //// 打印banner日志信息 //////////////////////////////////////////////////////////////////////