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)
随着大数据与人工智能领域技术的发展和应用的普及,算法越发繁多复杂,需要处理的数据量也越发庞大,高性能计算能力就显得尤为重要. 本篇选自高季尧先生近期于清华大数据"技术·前沿"系列讲 ...
最新文章
- opencv中在图片上显示文本
- 蓝桥杯java第三届决赛第一题--星期日
- 一次SAP客户访谈记录
- 【Azure + Core】实现CI/CD(一)构建镜像并推送仓库
- wordpress进阶教程(十九):创建自定义的找回密码页面
- 写代码抽取代码的技巧
- Ubuntu sudo 出现unable to resolve host 解决方法
- 模块化编程的分层设计经验
- 怎么让Excel按某一列的数值来排序?
- 深入详细理解矩阵 (矩阵的加减乘、转置、共轭、共轭转置)
- Spotfire 对条形图中分组后的值排序
- 001简介-QQ群淘宝客软件开发详解
- python 公开课_Python入门公开课
- 摄像头水平视野垂直视野?_动物穿越:新视野的梦想更新
- windows文件鼠标右键添加工具快捷方式
- 在软件工程领域,搞科研的这十年!
- [Jzoj] 3461. 小麦亩产一千八
- 无奈,做程序员回三四线城市能干什么?
- 正弦激励下的弦振动方程计算机MATLAB仿真
- python 如何判断一个函数执行完成_菜鸟来也!50行Python代码一键整理桌面
热门文章
- 数列极限的概念及性质
- 南方科技大学郑浩计算机,南方科技大学2017年广东综合评价入选资格考生名单(4)...
- 桌面图标有阴影去除方法
- 全新版大学英语综合教程第二册学习笔记(原文及全文翻译)——5A - True Height(真正的高度)
- SQL SERVER恢复数据库时出现Exclusive access could not be obtained because the database is in use
- 记事本改字体的代码java_记事本编程切换字体颜色 用java编写一个记事本程序
- AlphaTensor横空出世!打破矩阵乘法计算速度50年纪录,DeepMind新研究再刷Nature封面,详细算法已开源...
- 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
- 三相全桥整流电路_什么是三相桥式全控整流电路,三相桥式全控的工作原理是什么,三相桥式全控电路电路图...
- java金蝉素数_回文素数 - 寂寞暴走伤的个人空间 - OSCHINA - 中文开源技术交流社区...