前言
前几周陆陆续续花了5万多字写了我读到的Springboot启动过程的源码,收获颇多,其中给自己留了扩展的作业。我们每次启动Springboot的时候,都有一个Spring的Banner,读源码的过程中可以得知我们可以自定义属于自己的Banner,所以这就来把扩展的作业交上!
一、自定义Banner
我们先来自定义个一个Banner,再来分析是怎么读到自定义的Banner的。
我们在resources下面增加一个名为banner.txt
的文件:
切记:这里的文件名只能叫这个,否则代码读取不到,待会咱们再回顾源码就知道了。
文件内容为:
__ _ __
/ / | | / /
| | | | | |
| | | | | |
___| |__| |____ ___| |__
/____ __| ____\/___ ___|
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
|_| |_| |_| |_|
:: fhf::
我这里就写了我姓名拼音的第一个字母,把这个粘贴到banner.txt
文件中,直接启动Springboot就可以看到控制台打印的咱们自定义的Banner了。(PS:这个自己弄的不太好看,凑合看哈~)
控制台打印效果:
如此以后可以定制自己公司的Banner了,是不是很酷😎~~
二、自定义Banner打印源码分析
在我写的这篇博客的A.8、打印Banner信息中有详细分析了Spring的Banner的打印的过程,感兴趣的童鞋可以再回去看看哈~
我们再来来分析我们自定义的banner的打印过程。
我们从main方法进入来到SpringApplication的Banner printedBanner = printBanner(environment);
方法,再进入printBanner
方法中:
我们再进入断点的print
方法:
这里调用了getBanner
方法,在第三行banners.addIfNotNull(getImageBanner(environment));
,addIfNotNull
方法的入参有个getTextBanner(environment)
方法,进去之后可以看到:
此方法里面指定要读取name为spring.banner.location
的属性中的值为banner.txt
的属性,全局搜索一下spring.banner.location
,可以看到里面有不同包下的json文件中有这个值,具体读的哪个呢?这个我还没有搞懂,后面有时间再来补补作业。
很显然在getTextBanner
方法中if条件resource.exists()
是成立的,所以会执行if块中的内容,最后return new ResourceBanner(resource);
再回到addIfNotNull
方法,banner不为空,所以添加到Banner的List集合中了:
而上图中红框的hasAtLeastOneBanner
方法待会要用,我就提前截了个图,这个方法必然也是返回true,咱们接着回到getBanner
方法:
上图中的hasAtLeastOneBanner
就是咱们在上个图上中画红框的,结果是true,所以直接return banners
。
然后就是回到了print
方法,调用printBanner
对banner信息进行打印:
上图中的代码执行到了out.println(banner)
方法之后,自定义的banner就打印到了控制台了。
完活~是不是还挺简单的
-----------------你知道的越多,不知道的越多-----------------