springboot实现自定义banner.txt图

实现的方式非常简单,我们只需要在Spring Boot工程的/src/main/resources目录下创建一个banner.txt文件,然后将ASCII字符画复制进去,就能替换默认的banner了。
下面打印一下hello word

${AnsiColor.BRIGHT_GREEN}
.__           .__  .__                                   .___
|  |__   ____ |  | |  |   ____   __  _  _____________  __| _/
|  |  \_/ __ \|  | |  |  /  _ \  \ \/ \/ /  _ \_  __ \/ __ | 
|   Y  \  ___/|  |_|  |_(  <_> )  \     (  <_> )  | \/ /_/ | 
|___|  /\___  >____/____/\____/    \/\_/ \____/|__|  \____ | 
     \/     \/                                            \/ 
${AnsiColor.BRIGHT_RED}
Application Version: ${application.version}${application.formatted-version}
Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}

从上面的内容中可以看到,还使用了一些属性设置:

  • ${AnsiColor.BRIGHT_RED}:设置控制台中输出内容的颜色
  • ${application.version}:用来获取MANIFEST.MF文件中的版本号
  • ${application.formatted-version}:格式化后的
  • ${application.version}版本信息
  • ${spring-boot.version}:Spring Boot的版本号
  • ${spring-boot.formatted-version}:格式化后的
  • ${spring-boot.version}版本信息

生成ASCII字符画的地址

简单的说下底层实现

我用的是springboot1.5.13, 其他版本也是大同小异
开发工具是idea(我喜欢直接用idea看源码)
首先打开我们的springboot1.5.13如下图
这里写图片描述
这里写图片描述

这里的SpringApplicationBannerPrinter类就是关于在程序启动阶段banner图输出的,我们来看下源码吧!

class SpringApplicationBannerPrinter {

    static final String BANNER_LOCATION_PROPERTY = "banner.location";

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

    static final String DEFAULT_BANNER_LOCATION = "banner.txt";

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

    private static final Banner DEFAULT_BANNER = new SpringBootBanner();

    private final ResourceLoader resourceLoader;

    private final Banner fallbackBanner;

    SpringApplicationBannerPrinter(ResourceLoader resourceLoader, Banner fallbackBanner) {
        this.resourceLoader = resourceLoader;
        this.fallbackBanner = fallbackBanner;
    }
}

上面的代码片段截取可以看出默认配置banner图的文件名称是banner.txt默认获取路径是根目录。看到这就应该恍然大悟为什么banner.txt需要放在根目录下了吧。

在来看下他的源码片段是怎么获取输出的

    //构造方法
    SpringApplicationBannerPrinter(ResourceLoader resourceLoader, Banner fallbackBanner) {
        this.resourceLoader = resourceLoader;
        this.fallbackBanner = fallbackBanner;
    }

    //springboot 在启动的时候会调用print输出
    public Banner print(Environment environment, Class<?> sourceClass, Log logger) {
        Banner banner = getBanner(environment, this.fallbackBanner);
        try {
            logger.info(createStringFromBanner(banner, environment, sourceClass));
        }
        catch (UnsupportedEncodingException ex) {
            logger.warn("Failed to create String for banner", ex);
        }
        return new PrintedBanner(banner, sourceClass);
    }
    //print方法的重载
    public Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {
        Banner banner = getBanner(environment, this.fallbackBanner);
        banner.printBanner(environment, sourceClass, out);
        return new PrintedBanner(banner, sourceClass);
    }
    //获取banner图信息
    private Banner getBanner(Environment environment, Banner definedBanner) {
        Banners banners = new Banners();
        banners.addIfNotNull(getImageBanner(environment));
        //获取根目录下的banner.txt文件
        banners.addIfNotNull(getTextBanner(environment));
        if (banners.hasAtLeastOneBanner()) {
            return banners;
        }
        if (this.fallbackBanner != null) {
            return this.fallbackBanner;
        }
        //如果没设置banner.txt输出默认的banner
        return DEFAULT_BANNER;
    }
    //获取banner.txt
    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.txt其实是没有必要深究的,哈哈,但是也能让我们看出一点springboot启动加载的原理)

猜你喜欢

转载自blog.csdn.net/m0_37034294/article/details/80777744