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

使用ESP32和Flask框架实现温湿度数据监测系统

项目概述 在这个项目中&#xff0c;我们将使用ESP32微控制器读取温湿度传感器的数据&#xff0c;并将这些数据通过HTTP请求传输到基于Flask框架的服务器。Flask是一个轻量级的Python Web框架&#xff0c;非常适合快速开发和部署Web应用。通过这个项目&#xff0c;我们不仅可以了…...

为什么按照正确的顺序就能开始不断地解决问题,按照不正确的顺序,问题就没有办法能够得到解决呢?

按照正确的顺序解决问题与按照不正确的顺序可能导致问题无法解决&#xff0c;这背后有几个关键原因&#xff1a; 1. **逻辑性**&#xff1a; 正确的顺序通常遵循逻辑性和因果关系&#xff08;因为得按照这个基础的逻辑性才能够是自己顺应规律&#xff0c;太阳没有办法能够从西…...

嵌入式Linux gcc 编译器使用解析

目录 1.说明 2.分步编译法 3.编译源文件的四个阶段 4.gdb调试及常用命令 5.Makefile 1.说明 源文件 main.c 想生成 source gcc –g –O2 main.c –o source 黄色部分便是控制字 -g用于GDB –O2用于优化编译; 绿色部分表示源,可以由多个组成,用空格隔开; gcc …...

4、matlab双目相机标定实验

1、双目相机标定原理及流程 双目相机标定是将双目相机系统的内外参数计算出来&#xff0c;从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数&#xff08;如焦距、主点、畸变等&#xff09;和外部参数&#xff08;如相机位置、朝向等&#xff09…...

Oracle 数据库表和视图 的操作

1. 命令方式操作数据库&#xff08;采用SQL*Plus&#xff09; 1.1 创建表 1.1.1 基本语法格式 CREATE TABLE[<用户方案名>]<表名> (<列名1> <数据类型> [DEFAULT <默认值>] [<列约束>]<列名2> <数据类型> [DEFAULT <默认…...

美国ARC与延锋安全合作,推动汽车安全气囊技术新突破

在汽车安全领域&#xff0c;安全气囊作为关键被动安全配置&#xff0c;对于保障乘客生命安全至关重要。随着汽车工业的快速发展和科技创新的持续推进&#xff0c;安全气囊技术的升级与革新显得尤为重要。2022年10月25日&#xff0c;美国ARC公司与延锋安全携手合作&#xff0c;共…...

Docker:centos79-docker-compose安装记录

1.安装环境&#xff1a;centos7.9 x86 2.安装最新版&#xff1a; [rootlocalhost ~]# curl -fsSL get.docker.com -o get-docker.sh [rootlocalhost ~]# sh get-docker.sh # Executing docker install script, commit: e5543d473431b782227f8908005543bb4389b8desh -c yum in…...

相交链表(Leetcode)

题目分析&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 相交链表&#xff1a;首先我想到的第一个思路是&#xff1a;如图可知&#xff0c;A和B链表存在长度差&#xff0c;从左边一起遍历链表不好找交点&#xff0c;那我们就从后面开始找&#xff0c;但是这是单链表&…...

建造者模式(大话设计模式)C/C++版本

建造者模式 C 参考&#xff1a;https://www.cnblogs.com/Galesaur-wcy/p/15907863.html #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std;// Product Class&#xff0c;产品类&#xff0c;由多个…...

【地质灾害监测实现有效预警,44人提前安全转移】

6月13日14时&#xff0c;国信华源地质灾害监测预警系统提前精准预警&#xff0c;安全转移10户44人。 该滑坡隐患点通过科学部署国信华源裂缝计、倾角加速度计、雨量计、预警广播等自动化、智能化监测预警设备&#xff0c;实现了对隐患点裂缝、位移、降雨量等关键要素的实时动态…...