iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >教你怎么用Springboot自定义Banner图案
  • 309
分享到

教你怎么用Springboot自定义Banner图案

2024-04-02 19:04:59 309人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一、前言二、实现原理三、默认 Banner 实现类四、ImageBanner五、ResourceBanner六、SpringBootBanner七、实现 Banner 类八、Ba

一、前言

我们在启动 Spring Boot 项目时,默认会在控制台打印 spring loGo 和版本等信息,如下:

在这里插入图片描述

这就是 Spring Boot 的 Banner 打印功能,其实我们可以自定义打印的 banner ,也可以禁用和启用打印 banner 功能。在真实项目中,我们一般不会去自定义 banner 图案,它其实就是项目启动时打印图案或者文字而已,没实际意义。推荐在自己个人项目玩玩这个彩蛋即可,顺便简单了解下它内部实现原理。

比如,自定义一个 banner 之后,项目启动控制台打印如下所示:

在这里插入图片描述

二、实现原理

Spring Boot 有一个接口 org.springframework.boot.Banner 专门实现这个操作。要想自定义打印 banner ,只要自定义一个类实现这个接口,重写 printBanner 方法进行打印即可。Springboot 项目启动时,会创建我们的实现类对象,并调用对象的 printBanner 方法。


package org.springframework.boot;

import java.io.PrintStream;

import org.springframework.core.env.Environment;


@FunctionalInterface
public interface Banner {

	
	void printBanner(Environment environment, Class<?> sourceClass, PrintStream out);

	// 用于配置Banner的的枚举值
	enum Mode {
		// 关闭 banner 打印
		OFF,
        // 打印 banner 到 控制台
		CONSOLE,
		// 打印 banner 到日志文件
		LOG
	}
}

三、默认 Banner 实现类

Springboot 已经有几个自带的 Banner 实现类,Springboot 启动时会根据条件选择不同的 Banner 实现类进行打印 banner 信息。主要是 ImageBannerResourceBannerSpringBootBanner 这三个实现类。

1.项目启动时,会判断是否某些条件成立(项目中是否存在 banner 文件),成立则创建 ImageBannerResourceBanner 类对象,并且使用它们来打印 banner。

2.如果不成立检查是否存在我们自定义的 Banner 实现类 fallbackBanner,如果存在则使用它来打印 banner 图案。

3.否则,则使用默认的 SpringBootBanner 实现类来打印 banner,也就是我们经常看到 Spring 图案。


// 获取可用的 Banner 实现类
private Banner getBanner(Environment environment) {
	Banners banners = new Banners();
	banners.addIfNotNull(getImageBanner(environment));
	banners.addIfNotNull(getTextBanner(environment));
	if (banners.hasAtLeastOneBanner()) {
		return banners;
	}
	if (this.fallbackBanner != null) {
		return this.fallbackBanner;
	}
	// SpringBootBanner 实现类
	return DEFAULT_BANNER;
}

四、ImageBanner

org.springframework.boot.ImageBanner 类是专门加载和打印图片 banner 的。它检查配置文件 application.proeprties 是否有配置的 spring.banner.image.location 变量的值,这个值可用来指定要加载的图片,如果存在则构建 ImageBanner 对象。如果没有配置变量,则还会检查 Classpath 下是否存在以 banner 开头,以 .gif.jpg.png 结尾的图片文件,如果有也会构建 ImageBanner 对象。


class SpringApplicationBannerPrinter {

	static final String BANNER_IMAGE_LOCATION_PROPERTY = "spring.banner.image.location";

	static final String[] IMAGE_EXTENSION = { "gif", "jpg", "png" };

	// 获取 ImageBanner 对象
	private Banner getImageBanner(Environment environment) {
	    // 加载 spring.banner.image.location 指定的文件,文件存在则构建 ImageBanner 对象
		String location = environment.getProperty(BANNER_IMAGE_LOCATION_PROPERTY);
		if (StringUtils.hasLength(location)) {
			Resource resource = this.resourceLoader.getResource(location);
			return resource.exists() ? new ImageBanner(resource) : null;
		}
		// 查找 banner.gif,banner.jpg,banner.png 文件
		for (String ext : IMAGE_EXTENSION) {
			Resource resource = this.resourceLoader.getResource("banner." + ext);
			if (resource.exists()) {
				return new ImageBanner(resource);
			}
		}
		return null;
	}
}

五、ResourceBanner

org.springframework.boot.ResourceBanner 类是专门加载和打印字符 banner 的。它检查配置文件 application.proeprties 是否有配置的 spring.banner.location 变量的值,这个值可用来指定要加载的文件,如果存在则构建 ResourceBanner 对象。如果没有配置变量,则还会检查资源路径下是否存在 banner.txt 文件,如果存在也会构建 ResourceBanner 对象。


class SpringApplicationBannerPrinter {

	static final String BANNER_LOCATION_PROPERTY = "spring.banner.location";

	static final String DEFAULT_BANNER_LOCATION = "banner.txt";

	// 获取 ResourceBanner 对象
	private Banner getTextBanner(Environment environment) {
		String location = environment.getProperty(BANNER_LOCATION_PROPERTY, DEFAULT_BANNER_LOCATION);
		Resource resource = this.resourceLoader.getResource(location);
		if (resource.exists()) {
			return new ResourceBanner(resource);
		}
		return null;
	}
}

如果想要自定义 banner,我们一般在项目的 resources 资源目录下创建 banner.txt 文件,然后在里面填入我们想要的打印的文字内容即可。例如我在 banner.txt 文件中填充了 Chen Pi 内容,然后启动项目。

在这里插入图片描述
在这里插入图片描述

六、SpringBootBanner

如果项目没有设置以上两种自定义的 banner(ImageBanner 和 ResourceBanner),则默认情况下,会使用 SpringBootBanner 实现类打印 banner ,也就是我们启动 Springboot 项目时在控制台看到的打印 Spring 图案。源码如下:


package org.springframework.boot;

import java.io.PrintStream;

import org.springframework.boot.ansi.AnsiColor;
import org.springframework.boot.ansi.AnsiOutput;
import org.springframework.boot.ansi.AnsiStyle;
import org.springframework.core.env.Environment;


class SpringBootBanner implements Banner {
	// 这个就是我们启动 Springboot 项目时在控制台看到的图案
	private static final String[] BANNER = { "", "  .   ____          _            __ _ _",
			" /\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\", "( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\",
			" \\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )", "  '  |____| .__|_| |_|_| |_\\__, | / / / /",
			" =========|_|==============|___/=/_/_/_/" };

	private static final String SPRING_BOOT = " :: Spring Boot :: ";

	private static final int STRAP_LINE_SIZE = 42;

	@Override
	public void printBanner(Environment environment, Class<?> sourceClass, PrintStream printStream) {
		for (String line : BANNER) {
			printStream.println(line);
		}
		String version = SpringBootVersion.getVersion();
		version = (version != null) ? " (v" + version + ")" : "";
		StringBuilder padding = new StringBuilder();
		while (padding.length() < STRAP_LINE_SIZE - (version.length() + SPRING_BOOT.length())) {
			padding.append(" ");
		}

		printStream.println(AnsiOutput.toString(AnsiColor.GREEN, SPRING_BOOT, AnsiColor.DEFAULT, padding.toString(),
				AnsiStyle.FaiNT, version));
		printStream.println();
	}

}

七、实现 Banner 类

前面说我们可以实现 Banner 类,重写打印方法,实现自定义 banner 打印功能。


package com.chenpi;

import java.io.PrintStream;
import org.springframework.boot.Banner;
import org.springframework.core.env.Environment;


public class MyBanner implements Banner {

    @Override
    public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {

      String banner = "       .__                           .__ \n"
          + "  ____ |  |__   ____   ____   ______ |__|\n"
          + "_/ ___\\|  |  \\_/ __ \\ /    \\  \\____ \\|  |\n"
          + "\\  \\___|   Y  \\  ___/|   |  \\ |  |_> >  |\n"
          + " \\___  >___|  /\\___  >___|  / |   __/|__|\n"
          + "     \\/     \\/     \\/     \\/  |__|       ";

      out.println(banner);
    }
}

创建自定义的 Banner 实现类对象,设置到 SpringApplication 类对象的 banner 属性,最终这个属性的值会会被赋值到 SpringApplicationBannerPrinter 对象的 fallbackBanner 属性中,感兴趣的可以启动 debug 跟踪下。


package com.chenpi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootBannerApplication {
	public static void main(String[] args) {
		SpringApplication springApplication = new SpringApplication(SpringBootBannerApplication.class);
		// 设置自定义 Banner
		springApplication.setBanner(new MyBanner());
		// 启动 SpringBoot
		springApplication.run(args);
	}
}

八、Banner 样式控制

文章一开始的佛祖图形,你会发现是翠绿色的。其实 Springboot 支持我们修改 banner 的颜色,字体斜体,粗体等样式。SpringBoot 为我们提供了三个枚举类来设定这些样式。

1.AnsiColor:设定字符的前景色;参考 org.springframework.boot.ansi.AnsiColor 枚举类。

2.AnsiBackground:设定字符的背景色;参考 org.springframework.boot.ansi.AnsiBackground 枚举类。

3.AnsiStyle:设定字符的加粗、斜体、下划线等等;参考 org.springframework.boot.ansi.AnsiStyle 枚举类。

而且,在 banner.txt 文件中还可以引用一些全局变量,例如:

1.${spring-boot.version}:Spring Boot 版本号;

2.${spring-boot.formatted-version}:格式化后的 Spring Boot 版本号信息。

3.${application.version}:MANIFEST.MF 文件中的版本号;

4.${application.formatted-version}:格式化后的 MANIFEST.MF 文件中的版本号信息;

不仅如此,还可以引用我们在配置文件 application.properties 中定义的变量,例如在配置文件中定义了如下变量:


application.auth=chenpi

定义的 banner.txt 文件内容如下:


${AnsiColor.BRIGHT_GREEN}

//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//            佛祖保佑       永不宕机     永无BUG                     //

${AnsiColor.BRIGHT_CYAN}
Application Version: ${application.version}${application.fORMatted-version}
Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}

By -- ${application.auth}

启动项目,会在控制台打印的 banner 如下:

在这里插入图片描述

九、Banner 模式

在 Banner 接口中有定义一个枚举类,这个枚举定义了配置 Banner 的可能枚举值,如下:


@FunctionalInterface
public interface Banner {

	// 用于配置Banner的的枚举值
	enum Mode {
		// 关闭 banner 打印
		OFF,
        // 打印 banner 到 控制台
		CONSOLE,
		// 打印 banner 到日志文件
		LOG
	}
}

所以我们可以选择关闭 banner,banner 打印到控制台还是日志文件,如下:


package com.chenpi;

import org.springframework.boot.Banner.Mode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootBannerApplication {
    public static void main(String[] args) {
         SpringApplication springApplication = new SpringApplication(SpringBootBannerApplication.class);
         // 关闭 banner
         springApplication.setBannerMode(Mode.OFF);
         // 启动 SpringBoot
         springApplication.run(args);
    }
}

也可以配置文件中设置此值,如下


spring.main.banner-mode=off

如果启动类跟配置文件中都配置了对banner开关的设置,配置文件中设置的banner开关会优先于启动类中设置的开关。

十、banner 图生成工具

可能有人会问佛祖的图案怎么编辑出来的,其实网上有很多工具可以根据我们输入的内容或者图片,个性化制作ASCII字符和图案,推荐网址如下:

  • 定制化 ASCII 字符:Http://network-science.de/ascii/
  • 定制化 ASCII 图片:https://www.degraeve.com/img2txt.PHP

到此这篇关于教你怎么用Springboot自定义Banner图案的文章就介绍到这了,更多相关Springboot自定义Banner图案内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 教你怎么用Springboot自定义Banner图案

本文链接: https://www.lsjlt.com/news/128084.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 教你怎么用Springboot自定义Banner图案
    目录一、前言二、实现原理三、默认 Banner 实现类四、ImageBanner五、ResourceBanner六、SpringBootBanner七、实现 Banner 类八、Ba...
    99+
    2024-04-02
  • Springboot中如何自定义Banner图案
    这篇文章给大家介绍Springboot中如何自定义Banner图案,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、前言我们在启动 Spring Boot 项目时,默认会在控制台打印 Spring logo 和版本等信...
    99+
    2023-06-15
  • Springboot应用如何自定义Banner
    Springboot应用如何自定义Banner,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。这个小功能据说是Springboot2.x的小...
    99+
    2024-04-02
  • SpringBoot怎么自定义Starter
    这篇文章给大家分享的是有关SpringBoot怎么自定义Starter的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是StarterStarter是Spring Boot中的一个非常重要的概念,Starter...
    99+
    2023-06-22
  • Echarts怎么自定义图形
    本篇内容主要讲解“Echarts怎么自定义图形”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Echarts怎么自定义图形”吧!1.自定义图形最后的效果是这样的:图形由三个面组成,需要定义三个形状...
    99+
    2023-07-05
  • win10怎么自定义图标
    这篇文章将为大家详细讲解有关win10怎么自定义图标,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。win10自定义图标的方法首先需要找到进行修改的文件夹,右击文件夹选择属性。进入后切换为自定义选项,点击更...
    99+
    2023-06-10
  • SpringBoot怎么自定义路由覆盖
    这篇文章主要介绍“SpringBoot怎么自定义路由覆盖”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么自定义路由覆盖”文章能帮助大家解决问题。背景公司最近有一个项目二期需要对...
    99+
    2023-07-04
  • 怎么自定义springboot的启动端口
    本篇文章为大家展示了怎么自定义springboot的启动端口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。可以通过实现EmbeddedServletContainerCustomizer接口来实现:...
    99+
    2023-05-31
    springboot bo
  • 自定义视图view的折线图怎么使用
    这篇文章主要讲解了“自定义视图view的折线图怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“自定义视图view的折线图怎么使用”吧!绘制折线图预览图绘制这个折线图需要都需要哪些步骤?...
    99+
    2023-07-05
  • springboot怎么自定义LocaleResolver切换语言
    这篇文章主要介绍了springboot怎么自定义LocaleResolver切换语言的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot怎么自定义LocaleRe...
    99+
    2024-04-02
  • SpringBoot使用Prometheus采集自定义指标数据的方案
    目录一、我们需要什么指标二、在SrpingBoot中引入prometheus三、高级指标之分位数我们在k8s集群成功搭建了Prometheus服务。今天,我们将在springboot...
    99+
    2024-04-02
  • 一张思维导图带你打通SpringBoot自定义拦截器的思路
    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Spr...
    99+
    2023-08-18
    spring boot 后端 java
  • 使用PyCharm,逐步教你如何自定义背景颜色
    手把手教你在PyCharm中改变背景颜色,需要具体代码示例 一、背景颜色的重要性 对于软件开发者来说,一个舒适的开发环境是非常重要的。PyCharm作为一款强大的Python开发工具,在开发过程中提供了许多个性化的配置选项,其中...
    99+
    2024-02-03
    python pycharm 背景颜色设置
  • Python怎么自定义邻接表图类
    这篇文章主要介绍“Python怎么自定义邻接表图类”,在日常操作中,相信很多人在Python怎么自定义邻接表图类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么自定义邻接表图类”的疑惑有所帮助!...
    99+
    2023-07-04
  • 截图快捷键win7怎么自定义
    这篇文章主要介绍“截图快捷键win7怎么自定义”,在日常操作中,相信很多人在截图快捷键win7怎么自定义问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”截图快捷键win7怎么自定义”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-01
  • 怎么自定义View视图的属性及引用
    今天小编给大家分享一下怎么自定义View视图的属性及引用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、创建一个类,继承V...
    99+
    2023-07-05
  • FineReport中怎么利用JavaScript自定义地图标签
    这期内容当中小编将会给大家带来有关FineReport中怎么利用JavaScript自定义地图标签,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 <span >'+ FR.cont...
    99+
    2023-06-04
  • 怎么用自定义注解
    本篇内容介绍了“怎么用自定义注解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本知识在Java中,注解分为两种,元注解和自定义注解。很多人...
    99+
    2023-06-16
  • win10系统怎么自定义桌面图标
    在Windows 10系统中,你可以按照以下步骤来自定义桌面图标:1. 打开“设置”菜单,使用Win + I快捷键可以快速打开。2....
    99+
    2023-10-19
    win10
  • win7开始图标怎么自定义形状?
    Windows7自带的开始图标是个圆形的windows logo,如果想换种心情,可以自定义图标。win8的蓝色正方形logo不错,以这个为例。当然,你也可以用自己的头像! 软媒魔方电脑大师 V6.25 绿色免费版类型...
    99+
    2023-06-10
    win7 开始图标 自定义 形状
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作