当前位置: 首页 > news >正文

深入探索 Spring Boot 自定义启动画面

目录

  1. 引言
  2. 什么是 Spring Boot 启动画面
  3. Spring Boot 默认启动画面
  4. 为什么要自定义启动画面
  5. 如何自定义 Spring Boot 启动画面
    • 修改配置文件
    • 使用 Banner 接口
    • 通过图片实现启动画面
    • ASCII 艺术画的应用
  6. 进阶:基于环境变量的动态 Banner
  7. 多模块项目中的启动画面
  8. Spring Boot 启动画面最佳实践
  9. 常见问题及解决方案
  10. 结论

引言

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 艺术画的应用 进阶&#xff1a;基于环境变量的动态 Banner多模块项目中的启动画面Spring Boot…...

Redis实战—Redis分布式锁

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P56 - P63 目录 分布式锁介绍 基于Redis的分布式锁 Redis锁代码实现 修改业务代码 分布式锁误删问题 分布式锁原子性问题 Lua脚本 编写脚本 代码优化 总结 分布式锁介绍…...

联想Y7000P 2023款拆机教程及升级内存教程

0.电脑参数介绍 联想Y7000P 2023电脑&#xff0c;笔者电脑CPU为i7-13700H&#xff0c;14核20线程&#xff1b;标配内存为三星的DDR5-5600MHz-8GB*2&#xff0c;由于电脑CPU限制&#xff0c;实际内存跑的频率为5200MHz; 2个内存插槽&#xff0c;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&#xff08;为 Vue 2 设计&#xff09;和 Element Plus&#xff08;为 Vue 3 设计&#xff09;中&#xff0c;Empty&#xff08;空状态&#xff09;组件通常用于在数据为空或没有内容时向用户展示一种占位提示。然而&#xff0c;需要注意的是&#xff0c;Element…...

【AI作曲】毁掉音乐?早该来了!一个网易音乐人对于 AI 大模型音乐创作的思辨

引言&#xff1a;AI在创造还是毁掉音乐&#xff1f; 正如当初 midjourney 和 StableDiffusion 在绘画圈掀起的风波一样&#xff0c;suno 和 各大音乐大模型的来临&#xff0c;其实早该来了。 AI 在毁掉绘画&#xff1f;或者毁掉音乐&#xff1f; 没错&#xff0c;但也错了。…...

RabbitMQ实践——最大长度队列

大纲 抛弃消息创建最大长度队列绑定实验 转存死信创建死信队列创建可重写Routing key的最大长度队列创建绑定关系实验 在一些业务场景中&#xff0c;我们只需要保存最近的若干条消息&#xff0c;这个时候我们就可以使用“最大长度队列”来满足这个需求。该队列在收到消息后&…...

【pytorch02】手写数字问题引入

1.数据集 现实生活中遇到的问题 车牌识别身份证号码识别快递单的识别 都会涉及到数字识别 MNIST&#xff08;收集了很多人手写的0到9数字的图片&#xff09; 每个数字拥有7000个图像train/test splitting:60k vs 10k 图片大小28 28 数据集划分成训练集和测试集合的意义…...

【查看显卡信息】——Ubuntu和windows

1、VMware虚拟机 VMware虚拟机上不能使用CUDA/CUDNN&#xff0c;也安装不了显卡驱动 查看显卡信息&#xff1a; lspci | grep -i vga 不会显示显卡信息&#xff0c;只会输出VMware SVGA II Adapter&#xff0c;表示这是一个虚拟机&#xff0c;无法安装和使用显卡驱动 使用上…...

在 RK3568 上构建 Android 11 模块:深入解析 m、mm、mmm 编译命令

目录 Android 编译系统概述编译命令简介 环境准备使用 m、mm、mmm 编译模块编译整个源码树编译单个模块编译指定目录下的模块 高级应用并行编译清理编译结果编译特定配置 在 Android 开发中&#xff0c;特别是在 RK3568 这样的高性能平台上&#xff0c;有效地编译和管理模块是确…...

实战|YOLOv10 自定义目标检测

引言 YOLOv10[1] 概述和使用自定义数据训练模型 概述 由清华大学的研究团队基于 Ultralytics Python 包研发的 YOLOv10&#xff0c;通过优化模型结构并去除非极大值抑制&#xff08;NMS&#xff09;环节&#xff0c;提出了一种创新的实时目标检测技术。这些改进不仅实现了行业领…...

TTS前端原理学习 chatgpt生成答案

第一篇文章学习 小绿鲸阅读器 通篇使用chatgpt生成答案 文章&#xff1a; https://arxiv.org/pdf/2012.15404 1. 文章概述 本文提出了一种基于Distilled BERT模型的统一普通话文本到语音前端模块。该模型通过预训练的中文BERT作为文本编码器&#xff0c;并采用多任务学习技术…...

AI“音乐创作”横行给音乐家带来哪些隐忧

​​​​​​​近日&#xff0c;200多名国际乐坛知名音乐人联署公开信&#xff0c;呼吁AI开发者、科技公司、平台和数字音乐服务商停止使用人工智能(AI)来侵犯并贬低人类艺术家的权利&#xff0c;具体诉求包括&#xff0c;停止使用AI侵犯及贬低人类艺术家的权利&#xff0c;要求…...

SolidityFoundry 安全审计测试 Delegatecall漏洞2

名称&#xff1a; Delegatecall漏洞2 https://github.com/XuHugo/solidityproject/tree/master/vulnerable-defi 描述&#xff1a; 我们已经了解了delegatecall 一个基础的漏洞——所有者操纵漏洞&#xff0c;这里就不再重复之前的基础知识了&#xff0c;不了解或者遗忘的可…...

【字符串 状态机动态规划】1320. 二指输入的的最小距离

本文涉及知识点 动态规划汇总 字符串 状态机动态规划 LeetCode1320. 二指输入的的最小距离 二指输入法定制键盘在 X-Y 平面上的布局如上图所示&#xff0c;其中每个大写英文字母都位于某个坐标处。 例如字母 A 位于坐标 (0,0)&#xff0c;字母 B 位于坐标 (0,1)&#xff0…...

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…...

湖南(市场调研)源点咨询 新产品上市前市场机会调研与研究分析

湖南源点调研认为&#xff1a;无论是创业公司&#xff0c;还是在公司内部探索新的项目或者新的产品线等&#xff0c;首先都要做“市场机会分析与调研“&#xff0c;要真正思考并解答以下疑问&#xff1a; 我们的目标客户群体是谁&#xff0c;他们如何决策&#xff1f; 我们所…...

Vue82-组件内路由守卫

一、组件内路由守卫的定义 在一个组件里面去写路由守卫&#xff0c;而不是在路由配置文件index.js中去写。 此时&#xff0c;该路由守卫是改组件所独有的&#xff01; 只有通过路由规则进入的方式&#xff0c;才会调这两个函数&#xff0c;否则&#xff0c;若是只是用<Ab…...

【免费下载】 STM32Cube_FW_F4_V1.16.0 固件库

STM32Cube_FW_F4_V1.16.0 固件库 【下载地址】STM32Cube_FW_F4_V1.16.0固件库 本仓库提供了STM32CubeFW_F4_V1.16.0固件包的直接下载资源。STM32Cube是一个完整的软件平台&#xff0c;旨在支持STMicroelectronics&#xff08;意法半导体&#xff09;的STM32系列微控制器。这个特…...

别再只盯着RRT了!关节空间六次多项式规划,可能是更简单的机械臂避障方案

关节空间六次多项式规划&#xff1a;机械臂避障的优雅解法 在工业机器人领域&#xff0c;路径规划一直是核心挑战之一。当机械臂需要在充满障碍物的环境中工作时&#xff0c;传统基于笛卡尔空间的规划方法常常面临逆运动学奇异、轨迹不平滑等问题。而基于关节空间的六次多项式规…...

探索商业成功的奥秘:BABOK Guide v3深度解析

探索商业成功的奥秘&#xff1a;BABOK Guide v3深度解析 【下载地址】商业分析知识体系指南BABOKGuidev3 《商业分析知识体系指南&#xff08;BABOK Guide v3&#xff09;》是业界权威的商业分析专业标准&#xff0c;深受全球专业人士的认可与信赖。本指南经过严密的共识驱动开…...

【免费下载】 QQ空间说说批量删除插件:2023年最新版推荐

QQ空间说说批量删除插件&#xff1a;2023年最新版推荐 【下载地址】QQ空间说说批量删除插件-2023年最新版 本仓库提供了一个2023年最新版的QQ空间说说批量删除插件。该插件可以帮助用户快速批量删除QQ空间中的说说&#xff0c;节省大量手动操作的时间 项目地址: https://gitc…...

前端开发自救指南:不用写测试代码,5分钟用Playwright录制生成E2E测试脚本

前端开发自救指南&#xff1a;5分钟零代码生成E2E测试脚本的Playwright实战 最近在重构公司后台管理系统时&#xff0c;我遇到了一个典型的前端开发困境&#xff1a;每次修改表单验证逻辑后&#xff0c;都需要手动点击十几个字段组合来验证是否会影响其他功能。直到团队里的测…...

51c自动驾驶~合集57

我自己的原文哦~ https://blog.51cto.com/whaosoft/13960249 #端到端自动驾驶算法实现原理 1从传感器数据到控制策略的端到端方法 端到端自动驾驶基本流程: (1)子任务模型被更大规模的神经网络模型取代,最终即为端到端神经网络模型; (2)…...

Arduino与WS2812B打造智能节日彩灯:从硬件连接到编程实战

1. 项目概述&#xff1a;从零到一&#xff0c;点亮你的节日氛围又到年底了&#xff0c;各种节日接踵而至&#xff0c;无论是圣诞、元旦还是春节&#xff0c;家里总感觉少了点氛围感。买来的成品彩灯&#xff0c;要么模式单一&#xff0c;要么造型固定&#xff0c;总感觉差点意思…...

Armv9内存拷贝指令优化与性能调优

1. Arm架构内存拷贝指令深度解析在Armv9架构中&#xff0c;内存拷贝操作通过FEAT_MOPS(Memory Operations)特性得到显著增强。这套指令集专为高效内存操作设计&#xff0c;其中CPYFP/CPYFM/CPYFE系列指令实现了分阶段的内存拷贝机制。与传统的循环拷贝相比&#xff0c;这种设计…...

GPU缓存架构优化与AI加速器内存技术解析

1. GPU缓存架构与AI加速器的内存挑战在AI计算领域&#xff0c;内存子系统已成为制约性能提升的关键瓶颈。传统GPU采用的多级缓存架构&#xff08;L1/L2/L3&#xff09;虽然能有效缓解"内存墙"问题&#xff0c;但随着Transformer等大模型参数量呈指数级增长&#xff0…...

HLK-V20语音模块的智能家居实战:如何用STM32控制灯、电机并连接ESP8266上云

HLK-V20语音模块的智能家居实战&#xff1a;STM32联动控制与云端接入全解析 在智能家居DIY领域&#xff0c;语音控制早已从概念走向现实。HLK-V20作为一款高性价比的纯离线语音识别模块&#xff0c;配合STM32的丰富外设控制能力&#xff0c;可以构建出响应迅速、隐私安全的本地…...