用了自定義Banner后,SpringBoot瞬間變的高大上了...


Spring Boot 在啟動的時候,我們或許想要把自己公司的 logo,或者是項目的 logo 放上去,我們可以試試本文的這些方法,可以讓你快速制作一些 Spring Boot 項目啟動時的彩蛋,以提高項目的辨識度,或者是純碎為了給枯燥的生活平添一些樂趣,那么本文這些內容能很好的幫助到你。

本文知識點,如下圖所示:

知識圖譜.png

Banner效果展示

Spring Boot 默認的 banner 圖展示效果如下:
默認啟動 banner 圖.png
我們可以把它變成這樣的:

banner效果2.png

或者是這樣的:

banner效果1.png

或者是這樣的:

banner效果3.png
簡直秀的飛起,不但能自定義內容,還能自定義顏色,那接下來我們就來看它是如何實現的吧。

自定義Banner

自定義 banner 的實現方式有兩種,一種是通過重寫自定義的 Banner 類來實現,另一種通過 txt 文件來實現。

1.重寫Banner類

首先,需要自定義類實現 Banner 接口,實現代碼如下:

import org.springframework.boot.Banner;
import org.springframework.core.env.Environment;

import java.io.PrintStream;

public class MyBanner implements Banner {
    private static final String BANNER =
            "  ___ ___         .__  .__          \n" +
                    " /   |   \\   ____ |  | |  |   ____  \n" +
                    "/    ~    \\_/ __ \\|  | |  |  /  _ \\ \n" +
                    "\\    Y    /\\  ___/|  |_|  |_(  <_> )\n" +
                    " \\___|_  /  \\___  >____/____/\\____/ \n" +
                    "       \\/       \\/                  ";

    @Override
    public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
        out.println(BANNER);
        out.println();
    }
}

其中 BANNER 變量為自定義 banner 的內容,我這放入了一個 hello,然后在 Spring Boot 啟動時設置 Banner 類為自定義類,實現代碼如下:

public static void main(String[] args) {
    SpringApplication springApplication = new SpringApplication(DemoApplication.class);
    // 設置自定義 Banner
    springApplication.setBanner(new MyBanner());
    // 啟動 Spring Boot
    springApplication.run(args);
}

最終的執行效果如下圖所示:

自定義 banner.png

2.通過txt文件實現

我們可以在 Spring Boot 工程的 /src/main/resources 目錄下創建一個 banner.txt 文件,然后將 ASCII 字符畫復制進去,就能替換默認的 banner 了,如下圖所示:

bannertxt位置.png

之所以可以使用 banner.txt 文件的方式實現自定義 banner 是因為 Spring Boot 框架在啟動時會按照以下順序,查找 banner 信息:

  • 先在 Classpath 下找 文件 banner.gif 或 banner.jpg 或 banner.png , 先找到誰就用誰;
  • 以上都沒有就在 Classpath 下找 banner.txt;
  • 如果都沒找到才會使用默認的 SpringBootBanner。

以上知識點是在 SpringApplicationBannerPrinter 源碼中得知的,核心源碼如下:

class SpringApplicationBannerPrinter {
    static final String BANNER_LOCATION_PROPERTY = "spring.banner.location";
    static final String BANNER_IMAGE_LOCATION_PROPERTY = "spring.banner.image.location";
    static final String DEFAULT_BANNER_LOCATION = "banner.txt";
    static final String[] IMAGE_EXTENSION = new String[]{"gif", "jpg", "png"};
    // 忽略非核心源碼
    private Banner getBanner(Environment environment) {
        SpringApplicationBannerPrinter.Banners banners = new SpringApplicationBannerPrinter.Banners();
        // 獲取圖片形式 banner
        banners.addIfNotNull(this.getImageBanner(environment));
        // 獲取文字形式 banner
        banners.addIfNotNull(this.getTextBanner(environment));
        if (banners.hasAtLeastOneBanner()) {
            return banners;
        } else {
            return this.fallbackBanner != null ? this.fallbackBanner : DEFAULT_BANNER;
        }
    }

    private Banner getTextBanner(Environment environment) {
        String location = environment.getProperty("spring.banner.location", "banner.txt");
        Resource resource = this.resourceLoader.getResource(location);
        return resource.exists() ? new ResourceBanner(resource) : null;
    }

    private Banner getImageBanner(Environment environment) {
        String location = environment.getProperty("spring.banner.image.location");
        if (StringUtils.hasLength(location)) {
            Resource resource = this.resourceLoader.getResource(location);
            return resource.exists() ? new ImageBanner(resource) : null;
        } else {
            String[] var3 = IMAGE_EXTENSION;
            int var4 = var3.length;

            for(int var5 = 0; var5 < var4; ++var5) {
                String ext = var3[var5];
                Resource resource = this.resourceLoader.getResource("banner." + ext);
                if (resource.exists()) {
                    return new ImageBanner(resource);
                }
            }
            return null;
        }
    }
}

所以我們才能使用 banner.txt 自定義 banner 信息,當然你也可以使用圖片的方式來自定義 banner。

小技巧:我們可以使用 banner.gif 來實現動態 banner 的效果,動手試試吧。

此種方式實現起來比較簡單,且是無代碼侵入式的,推薦使用這種方式。

Banner樣式控制

上面講了 banner 文字部分的修改,我們還可以修改 banner 的演示以及其他屬性,例如字體的樣式,粗體、斜體等,Spring Boot 為提供了三個枚舉類來設定這些樣式,他們分別是:

  • AnsiColor:用來設定字符的前景色;
  • AnsiBackground:用來設定字符的背景色。
  • AnsiStyle:用來控制加粗、斜體、下划線等等。

例如,我們可以使用 AnsiColor 來設置顏色,banner.txt 中的信息如下:

${AnsiColor.BRIGHT_RED}  _  _              _       _
${AnsiColor.BRIGHT_RED} | || |    ___     | |     | |     ___
${AnsiColor.BRIGHT_YELLOW} | __ |   / -_)    | |     | |    / _ \
${AnsiColor.BRIGHT_YELLOW} |_||_|   \___|   _|_|_   _|_|_   \___/
${AnsiColor.BRIGHT_RED}_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|
${AnsiColor.BRIGHT_RED}"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'

最終的展示效果如下圖所示:

顏色效果.png

Banner使用輸出變量

在 banner.txt 中我們還可以輸出一些全局變量,例如:

  • ${application.version}:用來獲取 MANIFEST.MF 文件中的版本號;
  • ${application.formatted-version}:格式化后的 ${application.version} 版本信息;
  • ${spring-boot.version}:Spring Boot 版本號;
  • ${spring-boot.formatted-version}:格式化后的 ${spring-boot.version} 版本信息。

使用示例如下:

      /¯¯¯¯\     
    o-|[][]|-o   
      |_--_|     
   /¯¯¯¯¯¯¯¯¯¯\  
   |||  «»  |||  
   |||      |||  
  (o)|      |(o) 
     |  ||  |    
     |__||__|    
     |__||__|

Spring Boot 版本:${spring-boot.version}

Banner圖在線生成

在線生成 banner 的地址:

推薦使用第一種,使用縮略圖如下:

在線地址-1.png

隱藏Banner

如果我們需要隱藏 banner 信息,可以通過以下三種方法實現。

1.通過代碼關閉Banner

我們可以在 Spring Boot 啟動(run)之前設置隱藏 banner,實現代碼如下:

public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(DemoApplication.class);
        // 隱藏 banner
        springApplication.setBannerMode(Banner.Mode.OFF);
        // 啟動 Spring Boot
        springApplication.run(args);
    }
}

2.通過配置文件隱藏Banner

在 Spring Boot 的配置文件 application.properties 通過設置如下配置來隱藏 banner 的顯示,配置如下:

spring.main.banner-mode=off

3.在Idea中隱藏Banner

我們可以在 Idea 的調試配置中隱藏 banner,如下圖所示:
idea 關閉 banner.png

附:彩蛋

文章的末尾,附一個七彩佛祖的 banner 內容:

${AnsiColor.BRIGHT_GREEN}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
${AnsiColor.BRIGHT_YELLOW}$$                                _.ooOoo._                               $$
${AnsiColor.BRIGHT_RED}$$                               o888888888o                              $$
${AnsiColor.BRIGHT_CYAN}$$                               88"  .  "88                              $$
${AnsiColor.BRIGHT_MAGENTA}$$                               (|  ^_^  |)                              $$
${AnsiColor.BRIGHT_GREEN}$$                               O\   =   /O                              $$
${AnsiColor.BRIGHT_RED}$$                            ____/`-----'\____                           $$
${AnsiColor.BRIGHT_CYAN}$$                          .'  \\|       |$$  `.                         $$
${AnsiColor.BRIGHT_MAGENTA}$$                         /  \\|||   :   |||$$  \                        $$
${AnsiColor.BRIGHT_GREEN}$$                        /  _|||||  -:-  |||||-  \                       $$
${AnsiColor.BRIGHT_YELLOW}$$                        |   | \\\   -   $$/ |   |                       $$
${AnsiColor.BRIGHT_GREEN}$$                        | \_|  ''\-----/''  |   |                       $$
${AnsiColor.BRIGHT_YELLOW}$$                        \  .-\___  `-`  ____/-. /                       $$
${AnsiColor.BRIGHT_CYAN}$$                      ___`. .'   /--.--\   `. . ___                     $$
${AnsiColor.BRIGHT_RED}$$                    ."" '<  `.____\_<|>_/____.'  >'"".                  $$
${AnsiColor.BRIGHT_GREEN}$$                  | | :  `- \`.;`.\ _ /``;.`/ - ` : | |                 $$
${AnsiColor.BRIGHT_YELLOW}$$                  \  \ `-.   \_ ___\ /___ _/   .-` /  /                 $$
${AnsiColor.BRIGHT_CYAN}$$            ========`-.____`-.____\_____/____.-`____.-'========         $$
${AnsiColor.BRIGHT_MAGENTA}$$                                  `=---='                               $$
${AnsiColor.BRIGHT_YELLOW}$$            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        $$
${AnsiColor.BRIGHT_GREEN}$$                     佛祖保佑          永無BUG         永不修改         $$
${AnsiColor.BRIGHT_YELLOW}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
${AnsiColor.BRIGHT_YELLOW}

實現效果如下圖所示:

banner效果3.png

總結

本文我們講了自定義 banner 的兩種方法,自定義 banner 類和 banner.txt 的方式,其中以源碼分析的方式講了為什么可以通過 banner.txt 自定義 banner信息。我們還講了 banner 樣式控制(顏色、字體樣式等)和全局變量輸出的方法,以及 banner 圖在線生成的幾個地址,最后還講了 3 種隱藏 banner 的方法。

最后的話

認真寫好每一篇原創,只為不辜負你的觀看。寫作是一件很酷並且能幫助他人的事,我希望能一直堅持下去。如果覺得有用,請隨手給我一個贊吧,他將鼓勵我產出更好的文章。

參考 & 鳴謝

https://www.jianshu.com/p/c1f7617c99aa

https://www.jianshu.com/p/9a2c20e3766d


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM