在上一篇文章中介绍了spring-boot中的Banner的几种用法,接下来将会详细的介绍Banner的实现原理。
Banner的几种实现
想要实现一个Banner,只需要实现
org.springframework.boot.Banner
这个接口类,在前一篇文章中的自定义Banner就是这么干的。
在这个接口类中只有一个接口需要我们去实现:
我们只需要在这个接口里实现具体的Banner输出就可以了。
三种Banner的实现类关系图:
接下来我们看看这三种Banner都是怎么实现的。
首先我们来看看最简单的默认Banner--SpringBootBanner
代码非常的简单,我们从代码中可以看出一下几个特点:
- 输出的字符串是被直接保存在字符串数组里的,也不支持修改。
- 会输出一个srping-boot的版本好
- 版本号会在第42个字符开始输出
- ":: Spring Boot ::"字符串会被设置为绿色,版本好会被加粗
看完默认的Banner的实现,接下来就分析文本形式的Banner的实现方式。
下图为ResourceBanner的打印过程:
ResourceBanner中最为核心的部分是能够在文本中使用各种属性,使用的方式为:${property-name}。在ResourceBanner中总共构造了4种属性解释器,用来实现对于不同类型的属性进行文本替换。这4中解释器分别为(优先级由上到下递减):
- spring-boot的Environment,通过它可以获取到整个spring-boot工程的配置信息。
- 版本属性解释器,提供了版本属性,总共有一个属性值可以使用:application.version --- 应用版本(如:1.0.0),spring-boot.version --- spring-boot版本(如:2.1.0.RELEASE),application.formatted-version --- 格式化后的应用版本(如: (v1.0.0)),spring-boot.formatted-version --- 格式化后的spring-boot版本(如: (v2.1.0.RELEASE))。
- Ansi属性解释器,主要用来替换文本格式相关的属性,主要包括背景色、文字颜色、文字样式等内容。
- 应用title属性解释器,它只提供了一个属性:application.title,属性值是启动类所在包的implTitle。
最后我们在看看ImageBanner的实现。实现的流程:
Banner查找过程
下面一段代码就实现了各种Banner的查找过程:
从代码中可以看到整个查找过程:
先查找ImageBanner和ResourceBanner,并进行合并。如果前两个都没有找到就会使用自定义的Banner,如果还没有找到,就会使用默认的Banner,默认的Banner就是 SpringBootBanner的实例。
本文暂时没有评论,来添加一个吧(●'◡'●)