El proceso de código fuente de SpringBoot que imprime el banner Banner y cómo modificarlo

ImprimirBanner

El método printBanner(entorno) se llama en el constructor de org.springframework.context.ConfigurableApplicationContext

if (this.bannerMode == Banner.Mode.OFF) {
			return null;
		}
		ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader
				: new DefaultResourceLoader(null);
		SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);
		if (this.bannerMode == Mode.LOG) {
			return bannerPrinter.print(environment, this.mainApplicationClass, logger);
		}
		return bannerPrinter.print(environment, this.mainApplicationClass, System.out);
复制代码

Modo de impresión Banner.Mode

La clase de enumeración Banner.Mode establece el modo de impresión de banner de tres maneras

		/**
		 * Disable printing of the banner.
		 不打印
		 */
		OFF,

		/**
		 * Print the banner to System.out.
		 打印到控制台
		 */
		CONSOLE,

		/**
		 * Print the banner to the log file.
		 打印到日志文件
		 */
		LOG
复制代码

El modo de impresión se puede configurar a través del archivo de configuración

image-20220327135823410

#不打印
spring.main.banner-mode=off
#打印到控制台
spring.main.banner-mode=console
#打印到日志
spring.main.banner-mode=log

复制代码

Mire hacia atrás en el método printBanner

image-20220327140053082

Luego creó la clase SpringApplicationBannerPrinter para imprimir el banner

SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);
复制代码

resourceLoader es ahora el cargador de recursos predeterminado

while this.banner = null

Mire esta clase SpringApplicationBannerPrinter a la que se accede por primera vez, inicializa los valores de propiedad de los miembros estáticos e inicializa DEFAULT_BANNER

image-20220327140413729

image-20220327140647049

La forma de modificar el banner implementa la interfaz Banner

Entonces podemos crear directamente una clase Banner para implementar la interfaz Banner para imitar SpringBootBanner

public class MyBanner implements Banner {
    private static final String[] BANNER = { "", " \n" +
            "                                .::::.\n" +
            "                              .::::::::.\n" +
            "                              :::::::::::\n" +
            "                              ':::::::::::..\n" +
            "                               :::::::::::::::'\n" +
            "                                ':::::::::::.\n" +
            "                                  .::::::::::::::'\n" +
            "                                .:::::::::::...\n" +
            "                               ::::::::::::::''\n" +
            "                   .:::.       '::::::::''::::\n" +
            "                 .::::::::.      ':::::'  '::::\n" +
            "                .::::':::::::.    :::::    '::::.\n" +
            "              .:::::' ':::::::::. :::::      ':::.\n" +
            "            .:::::'     ':::::::::.:::::       '::.\n" +
            "          .::::''         '::::::::::::::       '::.\n" +
            "         .::''              '::::::::::::         :::...\n" +
            "      ..::::                  ':::::::::'        .:' ''''\n" +
            "   ..''''':'                    ':::::.' " };

    private static final String SPRING_BOOT = " :: fuck :: ";

    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();
    }
}

复制代码

Modificar el método principal de la clase de inicio principal

 public static void main(String[] args) {
       
       SpringApplication springApplication = new SpringApplication(AppTest.class);
        springApplication.setBanner(new MyBanner());

        springApplication.run( args);

    }
复制代码

Efecto:

image-20220327142535316

Continuar analizando el método printBanner

org.springframework.boot.SpringApplication#printBanner

image-20220327142141927

Llame al método bannerPrinter.print(environment, this.mainApplicationClass, System.out)

Entorno de configuración ConfigurableEnvironment de tres parámetros

mainApplicationClass El objeto de código de bytes de la clase de inicio principal

Flujo de salida System.out

跟进去 来到 org.springframework.boot.SpringApplicationBannerPrinter#print(org.springframework.core.env.Environment, java.lang.Class<?>, java.io.PrintStream)

image-20220327142327731

getBanner

看下这个 getBanner(environment) 从配置环境中拿 Banner对象的方法

image-20220327142642477

首先创建了一个 Banners 对象 org.springframework.boot.SpringApplicationBannerPrinter.Banners

image-20220327142802260

然后调用 banners.addIfNotNull(getImageBanner(environment));

getImageBanner(environment)

看下怎么从图片中拿到Banner对象

image-20220327143233182

image-20220327143248257

也就是图片只支持这三种格式

resourceLoader.getResource("banner." + ext)
复制代码

最重要看这行代码

去类加载路径下找 banner.gif,banner.jpg,banner.png文件 如果存在 则添加到 banners 集合中然后 立马返回

如果都没找到,继续执行

getTextBanner(environment)

banners.addIfNotNull(getTextBanner(environment));
复制代码

org.springframework.boot.SpringApplicationBannerPrinter#getTextBanner

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;
	}
复制代码
static final String DEFAULT_BANNER_LOCATION = "banner.txt";
复制代码

去类加载路径下找 banner.txt 文件 找到添加到 banners 集合里 然后立马返回

springBoot打印Banner源码

修改banner的方式二 类加载路径下创建 banner.文件

banner文件分两种 一种图片 图片的加载顺序为 gif,jpg,png

​ 一种txt

每种类型只能添加一个 同时最多打印两个banner 一个为图片类型的 一个为txt类型的

如 我在resource路径下放了两个banner文件,一个图片一个txt image-20220327151401245

idea64_QvxuG6Ckj7

生成banner的网站

关于佛祖的ascii艺术字,Spring Boot 佛祖 Banner-bootschool.net

image-20220327151737605

然后resource路径下先进一个banner.txt 粘贴 再启动项目

image-20220327151808949

Supongo que te gusta

Origin juejin.im/post/7079676025864454157
Recomendado
Clasificación