• SpringBoot从入门到精通教程(五)


    在这里插入图片描述

    上节,我们讲了 SpringBoot 如何使用MyBatis 今天我们讲讲 Springboot Logo自定义的问题,
    我们在启动 SpringBoot 时,控制台会打印 SpringBoot Logo 以及版本信息;这个操作是 SpringBoot 固定的还是可配置(自定义)的?

    记得点关注哦,防止迷路

    带着这个疑问,翻阅了一下源码发现这个操作还真可以自定义,SpringBoot 有一个接口 org.springframework.boot.Banner 是专门来做这个操作的。我们可以实现这个接口来自定义打印 Banner 信息;但是不推荐自己去写,因为这个不是什么重要的功能,没必要

    • org.springframework.boot.ResourceBanner

    文本格式,SpringBoot 会读取配置项banner.txt和banner.location,从配置项中获取真实的文件地址;如果配置中没有配置,会把配置项作为文件去加载;

    • org.springframework.boot.ImageBanner

    图片格式,SpringBoot 加载配置项banner.image.location,从配置项中获取真实的路径,SpringBoot 会根据配置项的路径加载文件。
    如果没有配置banner.image.location,转而依次加载banner.gif、banner.jpg、 banner.png这三个中存在的文件;

    如果上面两种都没有配置,SpringBoot 就会加载默认的 Banner;也就是文章开头介绍的方式。

    接下来我会介绍在文本格式(ResourceBanner);

    环境:
    操作系统:Windows10
    SpringBoot版本:1.5.12.RELEASE

    创建启动类:
    src/main/java/{package}/Application.java

    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            // 启动颜色格式化
           // 这不是唯一启动颜色格式的方式,有兴趣的同学可以查看源码
           /**
             * 1. AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
             * 2. 在`src/main/resources`目录下新建文件`application.properties`,
             *    内容为:`spring.output.ansi.enabled=always`
             * 
             * 重要:如果配置第二种方式,第一种方式就不会起作用
             */
            AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
            new SpringApplicationBuilder(Application.class)//
                    .main(SpringVersion.class) // 这个是为了可以加载 Spring 版本
                    .bannerMode(Banner.Mode.CONSOLE)// 控制台打印
                    .run(args);
        }
    }
    

    在这里插入图片描述
    创建Banner文件
    src/main/resource/banner.txt

    ${AnsiColor.BRIGHT_YELLOW}
    ////////////////////////////////////////////////////////////////////
    //                          _ooOoo_                               //
    //                         o8888888o                              //
    //                         88" . "88                              //
    //                         (| ^_^ |)                              //
    //                         O  =  /O                              //
    //                      ____/`---'\____                           //
    //                    .'  \|     |//  `.                         //
    //                   /  \|||  :  |||//                          //
    //                  /  _||||| -:- |||||-                         //
    //                  |   | \  -  /// |   |                       //
    //                  | \_|  ''---/''  |   |                       //
    //                    .-\__  `-`  ___/-. /                       //
    //                ___`. .'  /--.--  `. . ___                     //
    //              ."" '<  `.___\_<|>_/___.'  >'"".                  //
    //            | | :  `- \`.;` _ /`;.`/ - ` : | |                 //
    //               `-.   \_ __ /__ _/   .-` /  /                 //
    //      ========`-.____`-.___\_____/___.-`____.-'========         //
    //                           `=---='                              //
    //      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
    //            佛祖保佑       永不宕机     永无BUG                  //
    ////////////////////////////////////////////////////////////////////
    ${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}版本信息

    生成工具
    http://patorjk.com/software/taag
    http://www.network-science.de/ascii/
    http://www.degraeve.com/img2txt.php

    通过代码制定Banner,大家如果有细心的同学就会发现SpringBoot在启动时会调用如下一段代码:

    private Banner printBanner(ConfigurableEnvironment environment) {
     if (this.bannerMode == Banner.Mode.OFF) {
      return null;
     }
     ResourceLoader resourceLoader = this.resourceLoader != null ? this.resourceLoader
       : new DefaultResourceLoader(getClassLoader());
     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);
    }
    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);
    }
    private Banner getBanner(Environment environment, Banner definedBanner) {
     Banners banners = new Banners();
     banners.addIfNotNull(getImageBanner(environment));
     banners.addIfNotNull(getTextBanner(environment));
     if (banners.hasAtLeastOneBanner()) {
      return banners;
     }
     if (this.fallbackBanner != null) {
      return this.fallbackBanner;
     }
     return DEFAULT_BANNER;
    }
    private static final Banner DEFAULT_BANNER = new SpringBootBanner();
    

    而 SpringBootBanner长成这样

    /**
     * Default Banner implementation which writes the 'Spring' banner.
     *
     * @author Phillip Webb
     */
    class SpringBootBanner implements Banner {
      
     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 + ")");
      String padding = "";
      while (padding.length() < STRAP_LINE_SIZE
       - (version.length() + SPRING_BOOT.length())) {
       padding += " ";
      }
      
      printStream.println(AnsiOutput.toString(AnsiColor.GREEN, SPRING_BOOT,
       AnsiColor.DEFAULT, padding, AnsiStyle.FAINT, version));
      printStream.println();
     }
      
    }
    

    上述代码可以看到banner存在两种 imageBanner和textBanner
    imageBanner需要配置属性为banner.image.location
    或者支持名为banner格式为 “gif”, “jpg”, "png的图片
    textBanner支持默认情况下在banner.location 或者默认为banner.txt
    比如我们可以如下设置
    在这里插入图片描述在resource分别放置banner.txt和banner.png
    banner.png
    在这里插入图片描述banner.txt

    我们可以看一下结果
    在这里插入图片描述哈哈 F6小人变成了这样!!!
    关闭banner显示
    在程序中可以使用app.setBannerMode(Mode.OFF);来关闭banner,利用属性值设置则为:spring.main.banner-mode=off

  • 相关阅读:
    spring入门-day01
    HTML概述
    day21-基础加强
    iptables
    25个iptables常用示例
    Linux安全调优1:CentOS防火墙的设置与优化
    sessionStorage 的数据会在同一网站的多个标签页之间共享吗?这取决于标签页如何打开
    JavaScript reduce() 方法
    classList属性和className的区别
    NPM 学习笔记整理
  • 原文地址:https://www.cnblogs.com/spiritmark/p/13010182.html
Copyright © 2020-2023  润新知