我们平时在启动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类
本文暂时没有评论,来添加一个吧(●'◡'●)