专业的编程技术博客社区

网站首页 > 博客文章 正文

Banner-个性化定制控制台打印信息

baijin 2024-08-15 00:38:16 博客文章 7 ℃ 0 评论

我们平时在启动Spring的时候,控制台会打印启动日志信息,然后我们就看到一个这样的东西,这是Spring中默认打印的banner信息,如果我们想在启动的时候让它打印一个我们个性化的信息,该怎么玩呢?

要想知道怎么玩,首先要知道关于Banner的打印原理,我们先看一下Banner是如何打印的

Spring打印Banner的原理

在run方法中,有这么一行代码,这行代码的作用就是为了打印Banner信息,接下来我们看下它的原理

在进到printBanner中后,我们看到会创建一个SpringApplicationBannerPrinter,然后调用print方法

我们看下print方法做了什么事情,首先是获取banner,然后调用printBanner方法,如果没有获取到,则返回默认的Banner对象,首先我们先看下默认的Banner长什么样子

这里我们可以看到有一个fallbackBanner变量,我们可以通过SpringApplication类的springApplication.setBanner()方法进行设置我们自定义的banner类

这是SpringBootBanner,也是默认的Banner类,我们看到这就是刚开始Spring启动的时候打印的信息,调用printBanner方法,循环调用BANNER数组。

在了解了默认的Banner打印之后,如果我们想自定义个性信息,该怎么办呢,我们继续看

我们知道如果没有获取到指定banner信息,才会打印最终默认的banner类,那么我们该让spring如何获取指定的信息呢,我们来看这两行,这两行是为了获取Banner对象,然后返回。

//当前的Banners会获取所有的自定义Banner信息
private static class Banners implements Banner {

		private final List<Banner> banners = new ArrayList<>();

		public void addIfNotNull(Banner banner) {
			if (banner != null) {
				this.banners.add(banner);
			}
		}

		public boolean hasAtLeastOneBanner() {
			return !this.banners.isEmpty();
		}
		//这里就是打印banner的地方,简单来说就是把所有的banner循环,然后调用banner的printBanner方法
		
		@Override
		public void printBanner(Environment environment, Class<?> sourceClass,
				PrintStream out) {
			for (Banner banner : this.banners) {
				banner.printBanner(environment, sourceClass, out);
			}
		}

	}

那么重点就是getImageBanner(environment)和getTextBanner(environment)这两个方法是如何获取Banner对象的。

这里可以看到是banner.txt,然后判断哪个路径下的banner.txt呢,我们继续看

这里记下,会给ClassPathResource类的path变量赋值,后面判断存不存在会用到

这里可以看到,路径为resources目录下的banner.txt

当指定目录下的banner.txt存在时,则返回ResourceBanner对象

ResourceBanner实现了Banner,我们从上面的代码知道,spring会调用ResourceBanner的printBanner方法,我们看下printBanner方法

它会读取banner.txt文件中的数据,然后进行打印,然后就是我们所看到的个性化信息了。

到这里,我们知道,我们只需要在resources目录下增加一个banner.txt文件,然后在里面写上我们想打印的信息即可

我们试一下:

打印Banner总结

1、在resources目录下怎么一个banner.txt,然后写上我们的个性化信息

2、在resources目录下怎么一个banner.jpg,然后写上我们的个性化信息(gif,jpg,png

3、创建类实现Banner接口,我们可以通过SpringApplication类的springApplication.setBanner()方法进行设置我们自定义的banner类

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表