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

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

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

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

Banner效果展示

Spring Boot 默認的 banner 圖展示效果如下:

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

我們可以把它變成這樣的:

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

或者是這樣的:

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

或者是這樣的:

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

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

自定義Banner

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

1.重寫Banner類

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

<code>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();
    }
}/<code>

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

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

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

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

2.通過txt文件實現

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

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


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

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

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

<code>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                 String ext = var3[var5];
                Resource resource = this.resourceLoader.getResource("banner." + ext);
                if (resource.exists()) {
                    return new ImageBanner(resource);
                }
            }
            return null;
        }
    }
}/<code>

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

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

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

Banner樣式控制

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

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

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

<code>${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-'/<code>

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

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

Banner使用輸出變量

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

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

使用示例如下:

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

Banner圖在線生成

在線生成 banner 的地址:

由於頭條的限制原因發鏈接會有影響,可以關注 後私信【Banner】我會回覆你在線生成 banner 的地址,覺得不錯的朋友可以轉發一下

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

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

隱藏Banner

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

1.通過代碼關閉Banner

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

<code>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);
    }
}/<code>

2.通過配置文件隱藏Banner

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

<code>spring.main.banner-mode=off/<code>

3.在Idea中隱藏Banner

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

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

附:彩蛋

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

<code>${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}/<code>

實現效果如下圖所示:

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

總結

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


分享到:


相關文章: