SpringBoot基礎之banner玩法解析

←←←←←←←←←←←← 快!點關注spring

SpringBoot項目啓動時會在控制檯打印一個默認的啓動圖案,這個圖案就是咱們要講的banner。看似簡單的banner,咱們可以對它作些什麼呢?本篇文章就帶你們深刻了解一下banner的使用(版本:SpringBoot2.1.4)。sql

製做本身的banner

第一步:在src/main/resources下面建立banner.txt。數組

第二步:訪問網站http://patorjk.com/software/taag,在網站「Type Something 」處輸入想要製做的單詞(好比:Hello World),會生成對應的字符。也能夠經過其餘參數來調整字符的樣式。springboot

複製生成的字符,粘貼到banner.txt,再次啓動程序即可以打印出指定的banner了。架構

我的比較喜歡的banner是以下圖形:併發

${AnsiColor.BRIGHT_YELLOW}
////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//            佛祖保佑       永不宕機     永無BUG                  //
////////////////////////////////////////////////////////////////////

在新版本的SpringBoot中,支持了gif、jpg和png的圖片形式的banner打印。固然,並不會把圖片直接打印在控制檯,而是將其像素解析轉換成assii編碼以後打印。app

對於gif動圖,會把動圖的每一個圖片都打印出來,若是動圖比較大,打印時間較長。能夠嘗試一下,但建議不要使用gif。分佈式

在banner.txt中,還能夠進行一些設置,好比上圖中的ide

  • ${AnsiColor.BRIGHT_YELLOW}。
  • ${AnsiColor.BRIGHT_RED}:設置控制檯中輸出內容的顏色
  • ${application.version}:用來獲取MANIFEST.MF文件中的版本號
  • ${application.formatted-version}:格式化後的${application.version}版本信息
  • ${spring-boot.version}:Spring Boot的版本號
  • ${spring-boot.formatted-version}:格式化後的${spring-boot.version}版本信息

Banner接口

在未指定banner.txt或banner圖片時,默認圖形存儲在哪裏了呢?下面咱們瞭解一下Banner接口。spring-boot

@FunctionalInterface
public interface Banner {

  // 打印banner
  void printBanner(Environment environment, Class<?> sourceClass, PrintStream out);

  enum Mode {
    // 關閉
    OFF,
    // 控制檯
    CONSOLE,
    // 日誌文件
    LOG
  }
}

在banner接口中提供了打印banner的方法和一個枚舉類。枚舉類有三個值:OFF、CONSOLE、LOG,用來控制banner的打印,分別對應:關閉打印、控制檯打印和日誌打印。

banner接口的實現主要有ResourceBanner、ImageBanner、SpringBootBanner和其餘內部類的實現。其中上面看到的圖形的打印就來自於SpringBootBanner。看一下源代碼:

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

在printBanner的方法實現中,首先打印了默認的Banner字符串數組,而後將SPRING_BOOT和版本信息進行拼接打印。

Banner的參數設置

banner的參數設定能夠經過兩種形式,一種是代碼的形式,一種是配置文件的形式。

使用代碼的形式首先要將默認的main方法進行改造,手動建立SpringApplication對象,而後設置相應的參數。示例代碼:

public static void main(String[] args) {

  SpringApplication app = new SpringApplication(SpringbootBannerApplication.class);
  app.setBannerMode(Banner.Mode.CONSOLE);

  Banner banner = new ImageBanner(new ClassPathResource("banner1.png"));
  app.setBanner(banner);
  app.run(args);
}

經過配置文件設置就比較簡單,直接在application.properties中進行配置,springboot已經幫咱們預製好了相應的參數。

spring.banner.location=classpath:banner1.png
spring.banner.image.margin=2
spring.banner.image.height=76
spring.banner.charset=UTF-8
spring.banner.image.invert=false
spring.banner.image.location=banner1.png
spring.main.banner-mode=console
spring.main.show-banner=true

其中spring.main.show-banner來控制是否打印banner,在新版本中不建議使用,可使用spring.main.banner-mode代替,將其值設置爲OFF便可關閉banner的打印。

引入文本banner經過spring.banner.location來指定,引入圖片相關的banner須要經過spring.banner.image.location來指定路徑,不然會出現亂碼狀況。

若是不想顯示banner,能夠在代碼中經過setBannerMode(Banner.Mode.OFF)方法或經過參數配置spring.main.banner-mode=off來關閉banner的打印。上面示例中已經有所展現。

讀者福利:

分享免費學習資料

針對於還會準備免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)
爲何某些人會一直比你優秀,是由於他自己就很優秀還一直在持續努力變得更優秀,而你是否是還在知足於現狀心裏在竊喜!但願讀到這的您能點個小贊和關注下我,之後還會更新技術乾貨,謝謝您的支持!

資料領取方式:加入Java技術交流羣963944895,私信管理員便可免費領取

相關文章
相關標籤/搜索