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

原文地址:https://www.cnblogs.com/spiritmark/p/13010182.html