【Spring Boot 源码学习】自定义 Banner 信息打印

Spring Boot 源码学习系列

在这里插入图片描述

自定义 Banner 信息打印

  • 引言
  • 往期内容
  • 主要内容
    • 1. ResourceBanner 打印
      • 1.1 添加默认的 banner.txt 资源文件
      • 1.2 指定任意路径的资源文件
      • 1.3 添加自定义的信息
    • 2. ImageBanner 打印
      • 2.1 添加默认的图像资源文件
      • 2.2 指定任意路径的图像资源文件
      • 2.3 添加自定义的图像显示信息
        • 2.3.1 添加 Banner 图像宽度属性
        • 2.3.2 添加 Banner 图像高度属性
        • 2.3.3 添加 Banner 图像外边距属性
        • 2.3.4 添加 Banner 图像是否反转图片颜色的属性
        • 2.3.5 添加 Banner 图像位深度的属性
        • 2.3.6 添加 Banner 图像像素模式的属性
    • 3. Banners 打印
    • 4. 自定义 Banner 接口实现
  • 总结

引言

上篇博文,Huazie 带大家了解了完整的 Banner 信息打印流程。相信大家都跃跃一试了,那么本篇就以这些基础的知识,来自定义 Banner 信息打印。

注意: 以下涉及 Spring Boot 源码 均来自版本 2.7.9,其他版本有所出入,可自行查看源码。

在这里插入图片描述

往期内容

在开始本篇的内容介绍之前,我们先来看看往期的系列文章【有需要的朋友,欢迎关注系列专栏】:

Spring Boot 源码学习
Spring Boot 项目介绍
Spring Boot 核心运行原理介绍
【Spring Boot 源码学习】@EnableAutoConfiguration 注解
【Spring Boot 源码学习】@SpringBootApplication 注解
【Spring Boot 源码学习】走近 AutoConfigurationImportSelector
【Spring Boot 源码学习】自动装配流程源码解析(上)
【Spring Boot 源码学习】自动装配流程源码解析(下)
【Spring Boot 源码学习】深入 FilteringSpringBootCondition
【Spring Boot 源码学习】OnClassCondition 详解
【Spring Boot 源码学习】OnBeanCondition 详解
【Spring Boot 源码学习】OnWebApplicationCondition 详解
【Spring Boot 源码学习】@Conditional 条件注解
【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解
【Spring Boot 源码学习】RedisAutoConfiguration 详解
【Spring Boot 源码学习】JedisConnectionConfiguration 详解
【Spring Boot 源码学习】初识 SpringApplication
【Spring Boot 源码学习】Banner 信息打印流程

主要内容

1. ResourceBanner 打印

通过 SpringApplicationBannerPrinter##getTextBanner 方法的源码了解,我们现在可以进行如下的操作:

1.1 添加默认的 banner.txt 资源文件

当没有配置 spring.banner.location 属性,Spring Boot 默认就会加载资源根目录的 banner.txt 文件,如果存在该资源文件,则会使用 ResourceBanner 打印 Banner 信息。

下面我们在新建的 demo 项目的资源根目录添加名为 banner.txt 的资源文件,如下图所示:

在这里插入图片描述

然后,直接运行我们的 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

1.2 指定任意路径的资源文件

现在我们把上面的 banner.txt 移到资源根目录新建的 banner 目录里,并更名为 mybanner.txt,如下图所示:

在这里插入图片描述

接着,在 application.properties 中配置如下:

# Banner 资源文件路径
spring.banner.location=classpath:banner/mybanner.txt

然后,还是直接运行我们的 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

1.3 添加自定义的信息

查看 ResourceBanner 的源码,我们可以看到如下的代码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里就不得不提 PropertyResolver,它是 Spring 框架中的一个组件,主要用于解析各种属性源的属性值。它能够处理多种类型的底层源,包括properties 文件、yaml 文件,甚至是一些 nosql 数据库【因为这些数据源同样采用 key-value 形式存储数据】。

查看 PropertyResolverAPI 中,我可以看到它定义了一系列读取、解析和判断是否包含指定属性的方法。此外,它还支持以 ${propertyName:defaultValue} 格式的属性占位符,替换为实际的值的功能,这在动态配置中非常有用。

接下来,我们在 application.properties 中配置如下:

在这里插入图片描述

然后,我们在 banner.txt 中可以添加如下属性占位符:

在这里插入图片描述

最后,运行我们的 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

2. ImageBanner 打印

通过 SpringApplicationBannerPrinter##getImageBanner 方法的源码了解,我们现在可以进行如下的操作:

2.1 添加默认的图像资源文件

当没有配置 spring.banner.image.location 属性,Spring Boot 默认就会加载资源根目录的 banner.gifbanner.jpgbanner.png 等文件,如果存在其中某个资源文件,则会使用 ImageBanner 打印 Banner 信息。

下面我们在新建的 demo 项目的资源根目录添加名为 banner.gif 的资源文件,如下图所示:

在这里插入图片描述

然后,同样运行我们的 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

换成另外两个 banner.jpgbanner.png 也是能够加载的,如下:
在这里插入图片描述
在这里插入图片描述

默认 Banner 图像资源的加载逻辑:

  • 存在 banner.gif,则只加载 banner.gif
  • 不存在 banner.gif,存在 banner.jpg,则只加载 banner.jpg
  • 不存在 banner.gif,也不存在 banner.jpg,则加载 banner.png

2.2 指定任意路径的图像资源文件

现在我们把上面的 banner.png 移到资源根目录新建的 banner 目录里,并更名为 mybanner.png,如下图所示:

在这里插入图片描述

接着,在 application.properties 中配置如下:

# Banner 图像资源文件路径
spring.banner.image.location=classpath:banner/mybanner.png

然后,我们运行 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

2.3 添加自定义的图像显示信息

查看 ImageBanner 的源码,我们可以看到如下的代码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从上述源码,我们看到 ImageBanner 里面可以自定义一些图像的显示属性,比如:

  • spring.banner.image.width :设置 banner 图像的宽度,默认为 76 像素

  • spring.banner.image.height :设置 banner 图像的高度,默认按照宽度计算缩放比例,重新计算新图像的高度。
    在这里插入图片描述

  • spring.banner.image.margin :设置 banner 图像的外边距,默认为 2 像素

  • spring.banner.image.invert :设置是否反转图片的颜色。如果设置为 true,则颜色会被反转

  • spring.banner.image.bitdepth :设置图片的位深度,默认 4 位深度,还支持 8 位深度。位深度决定了图片的颜色精度,例如8位深度表示每个像素有256种颜色,不过大多数情况下,对于 Banner 图像输出到控制台,看起来基本没啥区别。

  • spring.banner.image.pixelmode :设置图片的的像素模式,有如下两个枚举值:

    • TEXT :文本模式,适用于需要清晰、简洁的图像效果的情况。
      在这里插入图片描述
    • BLOCK :块模式,适用于需要强调图像的某些部分或突出显示特定区域的情况。
      在这里插入图片描述

下面我们就来添加这些属性,来看看效果:

2.3.1 添加 Banner 图像宽度属性
spring.banner.image.width=50

运行 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

2.3.2 添加 Banner 图像高度属性
spring.banner.image.height=20

依旧运行 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

2.3.3 添加 Banner 图像外边距属性
spring.banner.image.margin=5

同样运行 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

2.3.4 添加 Banner 图像是否反转图片颜色的属性
spring.banner.image.invert=true

继续运行 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

2.3.5 添加 Banner 图像位深度的属性
spring.banner.image.bitdepth=8

然后运行 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述
我们发现上述好像设置了该属性,展示出来的图像并没有啥差异,事实上在也的确如此,可能我们的图像比较简单。

2.3.6 添加 Banner 图像像素模式的属性
spring.banner.image.pixelmode=block

运行 DemoApplication 入口类,可见如下运行截图:
在这里插入图片描述
在这里插入图片描述

3. Banners 打印

BannersSpringApplicationBannerPrinter 的私有静态内部类,它也实现了 Banner 接口,添加多个不同的 Banner 实现。在 SpringApplicationBannerPrinter##getBanner 方法中就能看到,新建 Banners 实例,并往其中添加了 ImageBannerResourceBanner

按照 Banners 的打印顺序,先添加进去的,先打印。

在这里插入图片描述
在这里插入图片描述

我们看看 ImageBannerResourceBanner 同时生效的场景:

在这里插入图片描述

运行 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

4. 自定义 Banner 接口实现

通过阅读 SpringApplicationBannerPrinter 的源码,我们知道如果 Banners 中没有 ResourceBanner 或者 ImageBanner 中的任何一个,就会判断自身的 fallbackBanner 变量是否存在,存在则直接返回。而该 fallbackBanner 变量实际上是 SpringApplication 中的 banner 变量。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

而我们查看 SpringApplication 的源码,可以看到如下方法:

在这里插入图片描述

下面就需要我们来自定义 Banner 接口的实现:

/*** 自定义 Banner 接口实现** @author huazie* @version 2.0.0* @since 2.0.0*/
public class CustomBanner implements Banner {@Overridepublic void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {String author = environment.getProperty("author");out.println(" _   _                 _      ");out.println("| | | |_   _  __ _ ___(_) ___ ");out.println("| |_| | | | |/ _` |_  / |/ _ \\");out.println("|  _  | |_| | (_| |/ /| |  __/");out.println("|_| |_|\\__,_|\\__,_/___|_|\\___|");out.println("                              ");out.println(" 作者: " + author);out.println();}
}

接下来,修改入口类 DemoApplication,如下:

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication(DemoApplication.class);springApplication.setBanner(new CustomBanner());springApplication.run(args);}
}

最后运行 DemoApplication 入口类,可见如下运行截图:

在这里插入图片描述

总结

本篇 Huazie 带大家自定义 Banner 信息打印,再次加深了对 Banner 信息打印流程的理解。当然,这只是 Spring Boot 启动过程中的一个小插曲,后续的博文我们将继续深入讲解 SpringApplication 的其他内容,敬请期待!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/216283.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea自动切换输入法Smart Input

idea搜索后下载 红色表示中文输入法 再ideavim场景下会自动切换成英文非常好用强烈推荐下载一个

Kafka 集群如何实现数据同步

Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统&#xff0c;不但像传统消息队列&#xff08;RaabitMQ、RocketMQ等&#xff09;那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上&#xff0c;用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…

Nginx模块开发之http handler实现流量统计(2)

文章目录 一、概述二、Nginx handler模块开发2.1、代码实现2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 总结 一、概述 上一篇【Nginx模块开发之http handler实现流量统计&#xff08;1&#xff09;】使用数组在单进程实现了IP的流量统计&a…

【【linux C 编程记述 之 VIM的用法讲述】】

linux C 编程记述 之 VIM的用法讲述 我们所说的编写代码包括两部分&#xff1a;代码编写和编译&#xff0c;在Windows下可以使用Visual Studio来完成这两部&#xff0c;可以在 Visual Studio 下编写代码然后直接点击编译就可以了。但是在 Linux 下这两部分是分开的&#xff0c…

深度学习+不良身体姿势检测+警报系统+代码+部署(姿态识别矫正系统)

正确的身体姿势是一个人整体健康的关键。然而&#xff0c;保持正确的身体姿势可能很困难&#xff0c;因为我们经常忘记这一点。这篇博文将引导您完成为此构建解决方案所需的步骤。最近&#xff0c;我们在使用 POSE 进行身体姿势检测方面玩得很开心。它就像一个魅力&#xff01;…

jenkins + gitlab 自动部署(webhook)

Jenkins是一个流行的开源CI/CD工具&#xff0c;可以与Git等版本控制系统集成&#xff0c;实现自动构建、测试和部署。Webhook是一种机制&#xff0c;可以在Git仓库中设置&#xff0c;在代码提交或合并请求时触发Jenkins构建任务&#xff0c;以完成自动化部署。 实操 设备信息 …

Matplotlib自定义坐标刻度_Python数据分析与可视化

自定义坐标刻度 主次要刻度隐藏刻度与标签花哨的刻度格式格式生成器与定位器 虽然matplotlib默认的坐标轴定位器与格式生成器可以满足大部分需求&#xff0c;但是并非对每一幅图都合适。 主次要刻度 学习前最好有对matplotlib图形的对象层级较为了解&#xff0c;例如查看前面…

如何打造“面向体验”的音视频能力——对话火山引擎王悦

编者按&#xff1a;随着全行业视频化的演进&#xff0c;我们置身于一个充满创新与变革的时代。在这个数字化的浪潮中&#xff0c;视频已经不再只是传递信息的媒介&#xff0c;更是重塑了我们的交互方式和体验感知。作为字节跳动的“能力溢出”&#xff0c;火山引擎正在飞速奔跑…

JSP:JDBC

JDBC&#xff08;Java Data Base Connectivity的缩写&#xff09;是Java程序操作数据库的API&#xff0c;也是Java程序与数据库相交互的一门技术。 JDBC是Java操作数据库的规范&#xff0c;由一组用Java语言编写的类和接口组成&#xff0c;它对数据库的操作提供基本方法&#…

情感对话机器人的任务体系

人类在处理对话中的情感时&#xff0c;需要先根据对话场景中的蛛丝马迹判断出对方的情感&#xff0c;继而根据对话的主题等信息思考自身用什么情感进行回复&#xff0c;最后结合推理出的情感形成恰当的回复。受人类处理情感对话的启发&#xff0c;情感对话机器人需要完成以下几…

计算机思考与整理

应用程序 虚拟机 windows,linux等操作系统&#xff08;向上层应用程序提供接口&#xff09; x86架构&#xff0c;MIPS&#xff0c;ARM(提供指令集) 硬件组件 硬件组件&#xff08;hardware components&#xff09;是指构成计算机或电子设备的实体部分&#xff0c;它们包括各…

量子计算 | 解密著名量子算法Shor算法和Grover算法

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…