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. mysql主键约束和唯一性约束
  2. angular 如何在index html 页面包含子页面_Webpack4.0各个击破(1)html篇
  3. [HNOI 2001]求正整数
  4. 兼容浏览器的布局CSS
  5. 生物特征验证是什么意思
  6. Longest Ordered Subsequence 最长上升子序列+DP
  7. c语言中声明外部函数需要添加的关键字,C语言中声明和定义的区别——分析extern关键词。...
  8. 使用Event Bus模式解耦Android App组件间通信
  9. 怎么将后缀为.opt,.frm,.myd,.myi文件还原或者是导入mySQL中
  10. memcached—认识Memcache
  11. 如何理解linux多用户多任务
  12. jenkins+testNG
  13. 进度计划管理软件 PowerPlan (包含GRID,甘特图,直方图,网络图,跟踪逻辑,时标概要图等功能)
  14. CentOS7 安装 7-zip 压缩工具
  15. python的qrcode模块计算矩阵二维码像素尺寸大小
  16. ssh-keygen 常用命令与参数
  17. 计算机考研全国统考时段,考研初试各科目时间安排
  18. 摘自《大江大河1949》
  19. java 图片添加水印(文字水印+图片水印)
  20. 浅聊Java反射机制(三)

热门文章

  1. 在大数据认知观和真实性不一样的?
  2. 我的JAVA面试经验(5年左右工作经验)
  3. QT概念详解及开发入门简介
  4. 小工具--理财计算器
  5. Quartile收购Sidecar,打造首屈一指的跨渠道电商广告平台
  6. C语言中write函数
  7. 教您用Xshell快速连接远程电脑
  8. win10网络适配器不见了_Win10网络适配器消失不见了怎么办?,爱纯净官网
  9. windows下C盘文件夹管理员权限设置
  10. Kotlin技术 - 委托和代理