Spring Boot - 自定义 Banner 图案 (2)

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 内容,然后启动项目。

Spring Boot - 自定义 Banner 图案

Spring Boot - 自定义 Banner 图案

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; /** * Default Banner implementation which writes the 'Spring' banner. */ class SpringBootBanner implements Banner { // 这个就是我们启动 Springboot 项目时在控制台看到的图案 private static final String[] BANNER = { "", " . ____ _ __ _ _", " /\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\", "( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\", " \\\\/ ___)| |_)| | | | | || (_| | ) ) ) )", " ' |____| .__|_| |_|_| |_\\__, | / / / /", " =========|_|==============|___/=http://www.likecs.com/_/_/_/" }; 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; /** * @Description 自定义 Banner 实现类 * @Author Mr.nobody * @Date 2021/6/4 * @Version 1.0 */ 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 样式控制

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydzzs.html