详细分析Springboot自定义启动界面(附Demo)

目录

  • 前言
  • 1. banner.text
    • 1.1 配置文件关闭
    • 1.2 启动类关闭
    • 1.3 命令行关闭
  • 2. 自定义Banner类
  • 3. 自动配置类
  • 4. 总结

前言

实现自定义启动动画是一项有趣的任务,虽然Spring Boot本身不提供内置的动画功能,但可以通过一些技巧来实现

以下主要以Demo的形式展示,再者下面的Demo都可以联合使用

1. banner.text

在资源文件夹(通常是src/main/resources)下放置一个名为banner.txt的文件,来自定义应用启动时的Banner,文件的内容会在应用启动时显示在控制台中

优点如下:简单且易于实现,且只需在banner.txt文件中定义文本即可,不需要编写Java代码
缺点如下:只能显示静态文本或图案,不支持动态动画效果

整体的Demo如下:

.__   __.   ______      .______    __    __    _______
|  \ |  |  /  __  \     |   _  \  |  |  |  |  /  _____|
|   \|  | |  |  |  |    |  |_)  | |  |  |  | |  |  __
|  . `  | |  |  |  |    |   _  <  |  |  |  | |  | |_ |
|  |\   | |  `--'  |    |  |_)  | |  `--'  | |  |__| |
|__| \__|  \______/     |______/   \______/   \______|         

之后启动应用程序即可

截图如下:

在这里插入图片描述

已经设置了banner.txt文件来显示自定义启动Banner,但希望在某些情况下关闭这个Banner

1.1 配置文件关闭

在Spring Boot的配置文件(例如application.properties或application.yml)中设置spring.main.banner-mode属性为off来关闭Banner

application.properties:

spring.main.banner-mode=off

application.yml:

yaml
复制代码
spring:main:banner-mode: off

1.2 启动类关闭

只需要设置为off即可

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class CustomBannerApplication {public static void main(String[] args) {SpringApplication app = new SpringApplication(CustomBannerApplication.class);app.setBannerMode(Banner.Mode.OFF);app.run(args);}
}

1.3 命令行关闭

java -jar your-application.jar --spring.main.banner-mode=off

2. 自定义Banner类

创建一个实现Banner接口的类,例如CustomBanner:

Demo如下:

import org.springframework.boot.Banner;
import org.springframework.core.env.Environment;
import java.io.PrintStream;public class CustomBanner implements Banner {@Overridepublic void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {out.println("Custom Startup Animation");for (int i = 0; i < 10; i++) {try {out.print(".");Thread.sleep(500); // 延时0.5秒} catch (InterruptedException e) {Thread.currentThread().interrupt();}}out.println();}
}

在启动类中设置自定义Banner

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class CustomBannerApplication {public static void main(String[] args) {SpringApplication app = new SpringApplication(CustomBannerApplication.class);app.setBanner(new CustomBanner());app.run(args);}
}

相对复杂的动画特效如下:

import org.springframework.boot.Banner;
import org.springframework.core.env.Environment;import java.io.PrintStream;public class CustomBanner implements Banner {@Overridepublic void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {out.println("Starting Application...");int max = 50;for (int i = 0; i <= max; i++) {out.print("\r[");for (int j = 0; j < max; j++) {if (j < i) {out.print("=");} else {out.print(" ");}}out.print("] " + i * 2 + "%");try {Thread.sleep(100); // 延时0.1秒} catch (InterruptedException e) {Thread.currentThread().interrupt();}}out.println("\nApplication Started.");}
}

3. 自动配置类

也可通过自动配置类

import org.springframework.boot.Banner;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;@AutoConfiguration
public class BannerAutoConfiguration {@Beanpublic BannerApplicationRunner bannerApplicationRunner() {return new BannerApplicationRunner();}
}

实现一个BannerApplicationRunner类,包含自定义启动动画逻辑:

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;@Component
public class BannerApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println("Custom Startup Animation");for (int i = 0; i < 10; i++) {System.out.print(".");Thread.sleep(500);}System.out.println();}
}

启动类无需修改
只需要添加自动加载以及扫描对应包即可:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SuppressWarnings("SpringComponentScan")
@SpringBootApplication(scanBasePackages = {"${info.base-package}.server", "${info.base-package}.module"})
public class ServerApplication {public static void main(String[] args) {SpringApplication.run(ServerApplication.class, args);}
}

总的来说:

  • @AutoConfiguration:确保BannerAutoConfiguration在应用启动时被自动加载
  • @Bean:定义一个bean,这个bean在应用启动时被创建并注册到Spring容器中
  • @SpringBootApplication:触发组件扫描和自动配置

4. 总结

  • banner.txt方法:适合简单的静态文本展示,易于实现,但缺乏动态效果
  • 自定义Banner类方法:适合复杂的动态效果,实现灵活,但需要编写Java代码
  • 自动配置类方法:结合了Spring Boot自动配置的优点,配置类自动加载,适合更复杂的配置和动态效果

如果上述的Demo多个联合使用,需要注意时间顺序
可以在如下加入延迟,类似如下:

public class BannerApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) {ThreadUtil.execute(() -> {ThreadUtil.sleep(1, TimeUnit.SECONDS); // 延迟 1 秒,保证输出到结尾log.info("ceshi");});}
}

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

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

相关文章

三字棋游戏(C语言详细解释)

hello&#xff0c;小伙伴们大家好&#xff0c;算是失踪人口回归了哈&#xff0c;主要原因是期末考试完学校组织实训&#xff0c;做了俄罗斯方块&#xff0c;后续也会更新&#xff0c;不过今天先从简单的三字棋说起 话不多说&#xff0c;开始今天的内容 一、大体思路 我们都知…

MongoDB教程(十三):MongoDB覆盖索引

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言什么是覆盖…

数据结构(栈及其实现)

栈 概念与结构 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进⾏插⼊和删除元素操作。 进⾏数据插⼊和删除操作的⼀端称为栈顶&#xff0c;另⼀端称为栈底。栈中的数据元素遵守后进先出 LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&…

PyCharm创建一个空的python项目

1.设置项目路径 2.配置python解释器 右下角可以选择always

【Linux】线程——生产者消费者模型、基于阻塞队列的生产消费者模型、基于环形队列的生产消费者模型、POSIX信号量的概念和使用

文章目录 Linux线程6. 生产消费者模型6.1 基于阻塞队列的生产消费者模型6.1.1 阻塞队列模型实现 6.2 基于环形队列的生产消费者模型6.2.1 POSIX信号量的概念6.2.2 POSIX信号量的使用6.2.3 环形队列模型实现 Linux线程 6. 生产消费者模型 生产消费者模型的概念 生产者消费者模…

Jackson详解

文章目录 一、Jackson介绍二、基础序列化和反序列化1、快速入门2、序列化API3、反序列化API4、常用配置 三、常用注解1、JsonProperty2、JsonAlias3、JsonIgnore4、JsonIgnoreProperties5、JsonFormat6、JsonPropertyOrder 四、高级特性1、处理泛型1.1、反序列化List泛型1.2、反…

Java 写一个可以持续发送消息的socket服务端

前言 最近在学习flink, 为了模仿一个持续的无界的数据源, 所以需要一个可以持续发送消息的socket服务端. 先上效果图 效果图 socket服务端可以持续的发送消息, flink端是一个统计单词出现总数的消费端,效果图如下 源代码 flink的消费端就不展示了, 需要引入一些依赖和版本…

Linux系统编程基础

Linux操作系统 Linux不是一个具体的操作系统&#xff0c;而是一类操作系统的总称&#xff0c;具体版本成为发行版。 Red Hat&#xff1a;目前被IBM收购&#xff0c;收费版&#xff0c;目前最大的Linux供应商CentOS&#xff1a; Red Hat退出的免费版Ubuntu&#xff1a;界面比较友…

二十一、【机器学习】【非监督学习】- 谱聚类 (Spectral Clustering)​​

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

hung 之 Android llkd

目录 1. llkd 简介 2. 原理 2.1 内核活锁 2.2 检测机制 2.3 为什么 persistent stack signature 检测机制不执行 ABA 检查&#xff1f; 2.4 为什么 kill 进程后&#xff0c;进程还存在就能判定发生了内核 live-lock&#xff1f; 3. 代码 3.1 内核 live-lock 检查 3.2 …

摸鱼大数据——用户画像——如何给用户“画像”

2、如何给用户“画像” 2.1 什么是标签体系 标签: 是某一种用户特征的符号表示 标签体系: 把用户分到多少类别里面去, 这些类是什么, 彼此之间有什么关系, 就构成了标签体系 标签解决的问题: 解决描述(或命名)问题以及解决数据之间的关联 2.2.1 标签的分类 用户画像标签一…

【附源码】IMX6U嵌入式Linux开发板连接阿里云--MQTT协议

演示 IMX6U嵌入式Linux开发板连接阿里云 阿里云创建设备&&获取LinkSDK 如果还不知道怎么在阿里云创建设备和获取连接阿里云的LinkSDK的话&#xff0c;先看这篇文章&#xff0c;再到这里。看这篇文章的时候&#xff0c;麻烦将下方文章打开对照着看&#xff0c;因为一些…

重测序数据处理得到vcf文件

重测序数据处理得到vcf文件 文章目录 重测序数据处理前言1. 数据是rawdata&#xff0c;需用fastp对数据进行质控和过滤2. 利用getorganelle软件组装叶绿体基因组3. 检查基因组大小&#xff0c;确认是否完整&#xff0c;然后和已知的红毛菜科叶绿体基因组一起构树4. 根据树形结果…

微积分-微分应用2(平均值定理)

要得出平均值定理&#xff0c;我们首先需要以下结果。 罗尔定理 设函数 f f f 满足以下三个假设&#xff1a; f f f 在闭区间 [ a , b ] [a, b] [a,b] 上连续。 f f f 在开区间 ( a , b ) (a, b) (a,b) 上可导。 f ( a ) f ( b ) f(a) f(b) f(a)f(b) 则在开区间 ( a , b …

CTFHUB-SQL注入-UA注入

目录 判断是否存在注入 判断字段数量 判断回显位置 查询数据库名 查询数据库下的表名 查询表中的字段名 查询字段名下的数据 由于本关是UA注入&#xff0c;就不浪费时间判断是什么注入了&#xff0c;在该页面使用 burp工具 抓包&#xff0c;修改User-Agent&#xff0c;加…

JavaScript之Web APIs-DOM

目录 DOM获取元素一、Web API 基本认知1.1 变量声明1.2 作用和分类1.3 DOM树1.4 DOM对象 二、获取DOM对象2.1 通过CSS选择器来获取DOM元素2.2 通过其他方式来获取DOM元素 三、操作元素内容3.1 元素.innerTest属性3.2 元素.innerHTML属性 四、操作元素属性4.1 操作元素常用属性4…

图形编辑器基于Paper.js教程09:鼠标拖动画布,以鼠标点为缩放中心进行视图的缩放

如何使用Paper.js实现画布的缩放与拖动功能 在Web开发中&#xff0c;利用Paper.js库进行图形的绘制和交互操作是一种常见的实践。Paper.js是一个强大的矢量图形库&#xff0c;可以让开发者通过简洁的API完成复杂的图形操作。在本文中&#xff0c;我们将详细探讨如何使用Paper.…

昇思25天学习打卡营第29天 | 基于MindSpore通过GPT实现情感分类

基于MindSpore框架通过GPT模型实现情感分类展示了从项目设置、数据预处理到模型训练和评估的详细步骤&#xff0c;提供了一个完整的案例来理解如何在自然语言处理任务中实现情感分析。 首先&#xff0c;环境配置是任何机器学习项目的起点。项目通过安装特定版本的MindSpore和相…

未来已来:生成式 AI 在对话系统与自主代理中的探索

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 一、整体介绍 对话系统&#xff08;Chat&#xff09; 自主代理&#xff08;Agent&#xff09; 二、技术对比 技术差异 优…

安装anaconda后jupyter notebook打不开 闪退

首先&#xff0c;通过清华源安装了最新的anaconda&#xff08;安装在了D盘&#xff09; 尝试打开jupyter&#xff0c;发现小黑框1s后自己关了&#xff0c;根本不打开浏览器 之后尝试按照这个做了一遍https://blog.csdn.net/gary101818/article/details/123560304还是不行。。…