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;
}
  1. Banners是内部封装了一个List.Banner的内部类,其能力是可以包装多个Banner并依次进行打印
  2. 先找有没有图片banner
  3. 再找有没有文本banner
  4. 如果至少有一个那就返回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图-定制化相关推荐

  1. springboot的定制化方式

    springboot的定制化原理 个人理解,springboot设计目标就是希望利用提供各种默认约定配置,代替配置,从而达到简略配置的目的. 实现原理就是利用类似SPI机制,通过AutoConfigu ...

  2. SpringBoot定制化开发

    文章目录 SpringBoot定制化开发 SpringBoot定制化开发 原理分析套路: 先找他对应的场景,然后我们就可以定位到对应的xxxxAutoConfiguration看他内部导入了哪些组件, ...

  3. Echarts定制化组件展示网站(包括3d饼环图,3d柱状图,三维柱状图,水滴图)

    Echarts官方的定制化组件展示网站makeapie.com已经关闭了,上面有许多定制的组件作品. 比如3d饼环图,3d柱状图,三维柱状图,水滴图等等.    找到了可替代的​chartsdev.c ...

  4. SpringBoot使用assembly进行项目定制化打包

    SpringBoot使用assembly进行项目定制化打包 一.项目配置 1.添加插件 (1)编辑项目的 pom.xml 文件,加入 assembly 打包插件: <build><p ...

  5. SpringBoot 定制化原理

    一.定制化的常见方式 修改配置文件 xxxxxCustomizer 编写自定义的配置类 xxxConfiguration:+ @Bean替换.增加容器中默认组件:视图解析器 Web应用 编写一个配置类 ...

  6. 平安保险基于 SPI 机制的 RocketMQ 定制化应用

    作者:孙园园|平安人寿资深开发 为什么选用 RocketMQ 首先跟大家聊聊我们为什么会选用 RocketMQ,在做技术选型的过程中,应用场景应该是最先考虑清楚的,只有确定好了应用场景在做技术选型的过 ...

  7. 基于springboot的手办定制销售系统毕业设计源码031800

    Springboot手办定制销售系统 摘 要 随着人们生活水平的提高和互联网的发展,人们消费思想和消费方式的逐渐改变,使得消费者开始追求自身品味和个性.手办定制就是在这种条件下应运而生.手办定制是基于 ...

  8. 基于springboot的手办定制销售系统 毕业设计-附源码031800

    Springboot手办定制销售系统 摘要 随着人们生活水平的提高和互联网的发展,人们消费思想和消费方式的逐渐改变,使得消费者开始追求自身品味和个性.手办定制就是在这种条件下应运而生.手办定制是基于客 ...

  9. 面向隐私AI的TensorFlow深度定制化实践

    作者 | Rosetta团队 出品 | AI科技大本营(ID:rgznai100) 之前我们整体上介绍了基于深度学习框架开发隐私 AI 框架中的工程挑战和可行解决方案.在这一篇文章中,我们进一步结合 ...

  10. 独家 | 高季尧:定制化优化算法的应用与威力(附PPT)

    随着大数据与人工智能领域技术的发展和应用的普及,算法越发繁多复杂,需要处理的数据量也越发庞大,高性能计算能力就显得尤为重要. 本篇选自高季尧先生近期于清华大数据"技术·前沿"系列讲 ...

最新文章

  1. opencv中在图片上显示文本
  2. 蓝桥杯java第三届决赛第一题--星期日
  3. 一次SAP客户访谈记录
  4. 【Azure + Core】实现CI/CD(一)构建镜像并推送仓库
  5. wordpress进阶教程(十九):创建自定义的找回密码页面
  6. 写代码抽取代码的技巧
  7. Ubuntu sudo 出现unable to resolve host 解决方法
  8. 模块化编程的分层设计经验
  9. 怎么让Excel按某一列的数值来排序?
  10. 深入详细理解矩阵 (矩阵的加减乘、转置、共轭、共轭转置)
  11. Spotfire 对条形图中分组后的值排序
  12. 001简介-QQ群淘宝客软件开发详解
  13. python 公开课_Python入门公开课
  14. 摄像头水平视野垂直视野?_动物穿越:新视野的梦想更新
  15. windows文件鼠标右键添加工具快捷方式
  16. 在软件工程领域,搞科研的这十年!
  17. [Jzoj] 3461. 小麦亩产一千八
  18. 无奈,做程序员回三四线城市能干什么?
  19. 正弦激励下的弦振动方程计算机MATLAB仿真
  20. python 如何判断一个函数执行完成_菜鸟来也!50行Python代码一键整理桌面

热门文章

  1. 数列极限的概念及性质
  2. 南方科技大学郑浩计算机,南方科技大学2017年广东综合评价入选资格考生名单(4)...
  3. 桌面图标有阴影去除方法
  4. 全新版大学英语综合教程第二册学习笔记(原文及全文翻译)——5A - True Height(真正的高度)
  5. SQL SERVER恢复数据库时出现Exclusive access could not be obtained because the database is in use
  6. 记事本改字体的代码java_记事本编程切换字体颜色 用java编写一个记事本程序
  7. AlphaTensor横空出世!打破矩阵乘法计算速度50年纪录,DeepMind新研究再刷Nature封面,详细算法已开源...
  8. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
  9. 三相全桥整流电路_什么是三相桥式全控整流电路,三相桥式全控的工作原理是什么,三相桥式全控电路电路图...
  10. java金蝉素数_回文素数 - 寂寞暴走伤的个人空间 - OSCHINA - 中文开源技术交流社区...