Springboot-banner图-定制化
Springboot启动后打印的图形是什么?
相信有部分猿宝宝们看到Springboot启动后打印出的图形文字特别感兴趣
这种类图形化称为banner,也就是横幅,像我们引入一些其他厂商的框架比如mybatis也会打印出banner
基于Springboot制作Banner
快速制作
其实基于Springboot实现起来特别简单:
在resource下建一个banner.txt文件即可
我就直接输入一个笔名吧
POWER-J
启动下项目看看效果
看到了没,Spring被我的POWER-J替代了,不过有的猿宝宝会说,你这啥呀,也不是图形化的啊
别急,有现成的在线工具:
图片转图形文字
文字转图形文字
文字转图形文字2
作者随便选了个样式,来启动看下效果
Springboot打印banner原理
作者通过查看源码,并debug调试发现,SpringApplication在启动run方法时,会调用一个printBanner方法
private Banner printBanner(ConfigurableEnvironment environment) {if (this.bannerMode == Banner.Mode.OFF) {return null;}ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader: new DefaultResourceLoader(null);SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);if (this.bannerMode == Mode.LOG) {return bannerPrinter.print(environment, this.mainApplicationClass, logger);}return bannerPrinter.print(environment, this.mainApplicationClass, System.out);
}
其中SpringApplicationBannerPrinter就是Springboot打印banner的关键
先不管逻辑细节,我们主要看看banner.txt是如何加载的?如果没有banner.txt会怎么样?
直接来看SpringApplicationBannerPrinter的print方法
Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {Banner banner = getBanner(environment);banner.printBanner(environment, sourceClass, out);return new PrintedBanner(banner, sourceClass);
}
流程很简单:1、获取Banner对象;2、打印banner;3、返回一个Banner的子包装类PrintedBanner对象
那具体针对获取Banner对象进行分析:
private Banner getBanner(Environment environment) {Banners banners = new Banners();banners.addIfNotNull(getImageBanner(environment));banners.addIfNotNull(getTextBanner(environment));if (banners.hasAtLeastOneBanner()) {return banners;}if (this.fallbackBanner != null) {return this.fallbackBanner;}return DEFAULT_BANNER;
}
- Banners是内部封装了一个List.Banner的内部类,其能力是可以包装多个Banner并依次进行打印
- 先找有没有图片banner
- 再找有没有文本banner
- 如果至少有一个那就返回banners,如果一个都没有就返回默认的banner,这个DEFAULT_BANNER就是SpringBootBanner,用来打印Spring的banner
Banner定制化
那作者为什么要看源码呢?上面的用法其实基本满足大家使用了,直接新增一个banner.txt即可。
其实通过官方文档和源码,能让你更加了解Springboot加载banner的机制
banner.txt复杂配置
Springboot为我们提供了可以在banner.txt中配置的变量
关于application.version和application.formatted-version一般是在MANIFEST中定义的,不过你不像用MANIFEST也可以直接在配置文件定义,这种用法就没那么”官方“,但是你可以随便定义属性随便用
比如我在banner.txt中增加了如下内容:
${AnsiColor.GREEN}SpringBoot-Version:${spring-boot.version}
${AnsiColor.YELLOW}PowerJ-Version:${application.version}
${AnsiColor.DEFAULT}
打印结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M5fIRhF5-1655785223429)(C:\Users\Heyunqiu\AppData\Roaming\Typora\typora-user-images\image-20220621111540415.png)]
自定义Banner类
官方文档也说明了如何通过实现Banner类来达到自定义
它让我们自定义一个Banner类来实现Banner接口,并实现pringBanner()方法,并且声明成名为springBootBanner的单例bean(这一点要去确认)
增加自定义类
public class PowerJBanner implements Banner {@Overridepublic void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {out.println("powerJ");}
}
修改启动类
@SpringBootApplication
public class PowerjSpringBootBannerApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(PowerjSpringBootBannerApplication.class);application.setBanner(new PowerJBanner());application.run(args);}
}
启动查看下效果:
结果发现,打印出的banner还是之前banner.txt里的内容。为什么?
还记得上面源码部分getBanner方法么?其中有一个this.fallbackBanner,是在banners.hasAtLeastOneBanner()为false的情况下,才会使用这个banner,而这个banner正是我们在启动类中传进去的自定义banner,说明什么?
说明banner.txt的优先级是高于在启动类中setBanner的。那就先屏蔽banner.txt吧。
重启结果:
你这啥?还不如直接用banner.txt啊,效果不行啊?
这里作者建议大家去找一些java制作banner的轮子
比如这个
再比如这个
老实说现在的文章你都不知道到底你看的是不是原创,但还是鸣谢下上面两个博客作者吧
我后学也可能会造一个轮子,基于Springboot现有的一些工具类进行扩展,请期待吧!
Springboot-banner图-定制化相关推荐
- springboot的定制化方式
springboot的定制化原理 个人理解,springboot设计目标就是希望利用提供各种默认约定配置,代替配置,从而达到简略配置的目的. 实现原理就是利用类似SPI机制,通过AutoConfigu ...
- SpringBoot定制化开发
文章目录 SpringBoot定制化开发 SpringBoot定制化开发 原理分析套路: 先找他对应的场景,然后我们就可以定位到对应的xxxxAutoConfiguration看他内部导入了哪些组件, ...
- Echarts定制化组件展示网站(包括3d饼环图,3d柱状图,三维柱状图,水滴图)
Echarts官方的定制化组件展示网站makeapie.com已经关闭了,上面有许多定制的组件作品. 比如3d饼环图,3d柱状图,三维柱状图,水滴图等等. 找到了可替代的chartsdev.c ...
- SpringBoot使用assembly进行项目定制化打包
SpringBoot使用assembly进行项目定制化打包 一.项目配置 1.添加插件 (1)编辑项目的 pom.xml 文件,加入 assembly 打包插件: <build><p ...
- SpringBoot 定制化原理
一.定制化的常见方式 修改配置文件 xxxxxCustomizer 编写自定义的配置类 xxxConfiguration:+ @Bean替换.增加容器中默认组件:视图解析器 Web应用 编写一个配置类 ...
- 平安保险基于 SPI 机制的 RocketMQ 定制化应用
作者:孙园园|平安人寿资深开发 为什么选用 RocketMQ 首先跟大家聊聊我们为什么会选用 RocketMQ,在做技术选型的过程中,应用场景应该是最先考虑清楚的,只有确定好了应用场景在做技术选型的过 ...
- 基于springboot的手办定制销售系统毕业设计源码031800
Springboot手办定制销售系统 摘 要 随着人们生活水平的提高和互联网的发展,人们消费思想和消费方式的逐渐改变,使得消费者开始追求自身品味和个性.手办定制就是在这种条件下应运而生.手办定制是基于 ...
- 基于springboot的手办定制销售系统 毕业设计-附源码031800
Springboot手办定制销售系统 摘要 随着人们生活水平的提高和互联网的发展,人们消费思想和消费方式的逐渐改变,使得消费者开始追求自身品味和个性.手办定制就是在这种条件下应运而生.手办定制是基于客 ...
- 面向隐私AI的TensorFlow深度定制化实践
作者 | Rosetta团队 出品 | AI科技大本营(ID:rgznai100) 之前我们整体上介绍了基于深度学习框架开发隐私 AI 框架中的工程挑战和可行解决方案.在这一篇文章中,我们进一步结合 ...
- 独家 | 高季尧:定制化优化算法的应用与威力(附PPT)
随着大数据与人工智能领域技术的发展和应用的普及,算法越发繁多复杂,需要处理的数据量也越发庞大,高性能计算能力就显得尤为重要. 本篇选自高季尧先生近期于清华大数据"技术·前沿"系列讲 ...
最新文章
- mysql主键约束和唯一性约束
- angular 如何在index html 页面包含子页面_Webpack4.0各个击破(1)html篇
- [HNOI 2001]求正整数
- 兼容浏览器的布局CSS
- 生物特征验证是什么意思
- Longest Ordered Subsequence 最长上升子序列+DP
- c语言中声明外部函数需要添加的关键字,C语言中声明和定义的区别——分析extern关键词。...
- 使用Event Bus模式解耦Android App组件间通信
- 怎么将后缀为.opt,.frm,.myd,.myi文件还原或者是导入mySQL中
- memcached—认识Memcache
- 如何理解linux多用户多任务
- jenkins+testNG
- 进度计划管理软件 PowerPlan (包含GRID,甘特图,直方图,网络图,跟踪逻辑,时标概要图等功能)
- CentOS7 安装 7-zip 压缩工具
- python的qrcode模块计算矩阵二维码像素尺寸大小
- ssh-keygen 常用命令与参数
- 计算机考研全国统考时段,考研初试各科目时间安排
- 摘自《大江大河1949》
- java 图片添加水印(文字水印+图片水印)
- 浅聊Java反射机制(三)