色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Banner的輸出打印過程

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-13 11:25 ? 次閱讀

今天,我給大家來講講如何讓你的 Spring Boot 屌炸天,自定義 banner 。有些新入門的朋友可能會不知道 banner 是什么?它在哪里?我在哪里見過它嗎?這3連門是不是很有意思。我們今天所說的 banner 如下圖所示,想必大家在啟動 Spring Boot 項目的時候,大家都見過吧。

圖片

大家可能都見過永不宕機的佛祖的 banner 圖片吧。下圖,大家應該都很熟悉吧。

圖片

今天我就來帶大家來看看源碼,看看這個 banner 到底是怎么實現的。

Spring Boot 內置 3 種 Banner打印方式

從下圖可以看出,Spring Boot 支持打印的Banner 方式有3種, SpringBootBanner 是Spring Boot 默認的 Banner 打印方式, ResouceBanner 是文本類型的 Banner 打印方式, ImageBanner 是圖片類型的 Banner 打印方式。

圖片

我們來看看 Banner 接口,從下方的代碼,我們可以了解到,Banner 接口包含一個 printBanner 的方法 和 Mode 的枚舉,Mode 包含三種狀態,其中 OFF 表示不打印 Banner , LOG 表示把 Banner 輸出到日志文件中, CONSOLE 表示輸出到控制臺,也是我們比較常見的方式。

@FunctionalInterface
public interface Banner {
    void printBanner(Environment environment, Class< ? > sourceClass, PrintStream out);
    enum Mode {
        OFF,
        CONSOLE,
        LOG
    }
}

Banner 打印流程

從 SpringApplication 類的 run 方法可以看出,printBanner 方法在 prepareEnvironment 之后,這是因為 application.properties 中有一些關于 Banner 的配置項。需要先解析 application.properties 的值,并將其綁定到對應的 bean 之后,再進行后續的操作。

public ConfigurableApplicationContext run(String... args) {
    ...
    ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
    ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
    configureIgnoreBeanInfo(environment);
    // 打印 Banner
    Banner printedBanner = printBanner(environment);
    ...
}
private Banner printBanner(ConfigurableEnvironment environment) {
    if (this.bannerMode == Banner.Mode.OFF) {
        return null;
    }
    ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader
        : new DefaultResourceLoader(null);
    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);
}

printBanner 具體的流程如下:

  1. 判斷 bannerMode,如果是 OFF,表示不打印。如果是 LOG,表示打印到文件,否則打印到控制臺。
  2. SpringApplicationBannerPrinter 依據指定位置是是否存在文件,判斷 Banner 類型是文本還是圖片,文本類型使用 ResourceBanner, 圖片類型使用 ImageBanner, 如果都不是,使用 Spring Boot 默認的 SpringBootBanner。
  3. SpringApplicationBannerPrinter#print 方法調用 Banner 對象的的 printBanner 方法。不同類型的 Banner 的 printBanner 方法實現不同。

如下是 Banner 對象的獲得方法,可以看出,Spring Boot 首先獲得 ImageBanner,然后是 ResourceBanner,需要注意的是,這兩者可以同時存在,此時會一次性打印兩種 Banner。如果都不滿足,還會去獲得 fallbackBanner,這個是用戶自己設定的 Banner,但是我們基本很少使用,大部分情況我們使用了 Spring Boot 內置的 SpringBootBanner。

class SpringApplicationBannerPrinter {
    private Banner getBanner(Environment environment) {
        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 Banner getTextBanner(Environment environment) {
        String location = environment.getProperty(BANNER_LOCATION_PROPERTY, DEFAULT_BANNER_LOCATION);
        Resource resource = this.resourceLoader.getResource(location);
        try {
            if (resource.exists() && !resource.getURL().toExternalForm().contains("liquibase-core")) {
                return new ResourceBanner(resource);
            }
        }
        catch (IOException ex) {
            // Ignore
        }
        return null;
    }
    private Banner getImageBanner(Environment environment) {
        String location = environment.getProperty(BANNER_IMAGE_LOCATION_PROPERTY);
        if (StringUtils.hasLength(location)) {
            Resource resource = this.resourceLoader.getResource(location);
            return resource.exists() ? new ImageBanner(resource) : null;
        }
        for (String ext : IMAGE_EXTENSION) {
            Resource resource = this.resourceLoader.getResource("banner." + ext);
            if (resource.exists()) {
                return new ImageBanner(resource);
            }
        }
        return null;
    }
}

如何關閉 Spring Boot 的 Banner

從 SpringApplication#printBanner 方法可以看出。當我們將 bannerMode 設置為 Banner.Mode.OFF 的時候,該方法返回 null,也就是此時不會打印 Banner。所以只要設置 bannerMode 為 OFF ,我們就能關閉 Banner 功能。

private Banner printBanner(ConfigurableEnvironment environment) {
  if (this.bannerMode == Banner.Mode.OFF) {
    return null;
  }
  ...
}

第一種就是在啟動代碼中設置。如下所示。

public static void main(String[] args) {
        SpringApplication app
                = new SpringApplication(HelloApplication.class);
        app.setBannerMode(Banner.Mode.OFF);
        app.run(args);
}

第二種是在 application.properties 中配置 spring.main.banner-mode

spring.main.banner-mode=off

這兩種方式都可以關閉 Banner,那當它們同時存在的時候,哪個生效呢?我們可以這樣分析,啟動代碼中調用 setBannerMode 方法,改變了 bannerMode 的值,之后 SpringApplication 對象執行 run 方法,在 run 方法中會解析 application.properties 的值,并將其綁定到對應的 bean,后者覆蓋前者,所以 application.properties 中的配置優先級更高。

自定義文本類型的 Banner

Spring Boot 中自定義文本類型的 Banner 很簡單,我們只要在 resources 下增加一個 banner.txt 就可以了。比如我想讓 Banner 顯示 永不宕機的佛祖雕像。那我就可以在 banner.txt 中增加以下文本。

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

打印結果是這樣的

圖片

如果我們想打印彩色的 banner 出來呢?在Spring Boot 中我們可以利用 AnsiColor 類來實現,我們可以在 banner.txt 中使用 AnsiColor 指定后續的文本的顏色。

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

如下是最終的結果

圖片

public class ResourceBanner implements Banner {
    @Override
    public void printBanner(Environment environment, Class< ? > sourceClass, PrintStream out) {
        try {
            String banner = StreamUtils.copyToString(this.resource.getInputStream(),
                    environment.getProperty("spring.banner.charset", Charset.class, StandardCharsets.UTF_8));
            for (PropertyResolver resolver : getPropertyResolvers(environment, sourceClass)) {
                banner = resolver.resolvePlaceholders(banner);
            }
            out.println(banner);
        }
        catch (Exception ex) {
            logger.warn(LogMessage.format("Banner not printable: %s (%s: '%s')", this.resource, ex.getClass(),
                    ex.getMessage()), ex);
        }
    }
    protected List< PropertyResolver > getPropertyResolvers(Environment environment, Class< ? > sourceClass) {
        List< PropertyResolver > resolvers = new ArrayList<  >();
        resolvers.add(environment);
        resolvers.add(getVersionResolver(sourceClass));
        resolvers.add(getAnsiResolver());
        resolvers.add(getTitleResolver(sourceClass));
        return resolvers;
    }
}

我們通過上述代碼來看看,Spring Boot 為什么能打印出帶顏色的 banner, ResourceBanner 將讀取到的文本流轉換為一串字符串。再通過4個解析器,來處理待輸出的 Banner 內容。

四個解析器分別是:

  • environment 對應 application.properties 中的配置;
  • VersionResolver 解析 spring boot 版本,
  • AnsiResolver 解析顏色或字體等樣式配置,
  • TitleResolver 解析當前應用的版本,名稱等。

Banner圖在線生成

在線生成 banner 的地址:

  • https://www.bootschool.net/ascii
  • http://www.network-science.de/ascii/
  • http://patorjk.com/software/taag//
  • http://www.degraeve.com/img2txt.php

總結

本文主要講述了Banner的輸出打印過程,如何打印個性化的文本 Banner。ImageBanner 沒在本文詳細說明,有興趣的朋友可以查看閱讀源碼,也比較簡單,也有助于你了解 Java 如何實現圖片轉文本的知識點。通過本文的知識點,你也可以根據自己的要求來實現 Banner, 設置為 fallbackBanner, 從而達到完全個性化的自定義 Banner 的效果。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8575

    瀏覽量

    151021
  • 打印
    +關注

    關注

    1

    文章

    64

    瀏覽量

    18714
  • Banner
    +關注

    關注

    0

    文章

    4

    瀏覽量

    7515
  • 日志
    +關注

    關注

    0

    文章

    138

    瀏覽量

    10639
收藏 人收藏

    評論

    相關推薦

    福祿克紅外熱像儀:如何控制3D打印工藝

    3D打印過程中,由于速度、距離、材料等特性的不同,在粉末逐層堆疊累積的過程中,溫度會出現異常,如跳變、過高、過低、不均勻等,造成打印后的結構件性能下降,韌度差、彈性不夠、變脆、隱紋等。使用大師之選系列熱像儀在可以為金屬
    發表于 05-08 07:21

    AB32VG1開發板開發環境搭建和串口調試打印過程

    有幸申請到開發板,下面說下開發環境搭建和串口調試打印過程1:先下載RTT studio開發工具,RTT studio下載地址2:下載完成后,需要測試帳號才可以登錄IDE,這部分略過3:新建RTT工程
    發表于 10-10 17:29

    東芝數碼復印機復印過程概述

    東芝數碼復印機復印過程概述: 充電: 將負電荷充至感光鼓的表面。 原稿曝光: 利用光照射原稿,將原稿上的圖像轉換為
    發表于 01-18 11:32 ?917次閱讀

    東芝數碼復印機復印過程詳述

    東芝數碼復印機復印過程詳述 1 、感光鼓 感光鼓包括兩層。外層是由有機光敏導體( OPC )制造的光敏層,內
    發表于 01-18 11:35 ?1005次閱讀

    東芝數碼復印機原理與復印過程概述

    東芝數碼復印機原理與復印過程概述 復印過程概述: 充電: 將負電荷充至感光鼓的表面。 原稿曝光: 利用光照射原稿,將
    發表于 01-18 11:44 ?2584次閱讀

    什么是Banner

    什么是Banner  英文縮寫: Banner 中文譯名: 網頁標識 分  類: IP與多媒體 解  釋: 網頁標識通常被用作橫
    發表于 02-22 11:13 ?1105次閱讀

    3D打印機使用說明書包括操作說明和注意事項和保養資料免費下載

    打印過程中,請勿觸碰電源線、USB 數據線及拔出 SD 卡,否則打印過程會中斷。擠出機在未擠絲的情況下,請勿長時間加熱,避免噴嘴堵塞。在進行打印機調試時,噴頭會擠出打印材料,因此請保
    發表于 10-10 08:00 ?0次下載
    3D<b class='flag-5'>打印</b>機使用說明書包括操作說明和注意事項和保養資料免費下載

    打印機如何取消打印任務

    如果文檔正在打印過程中需要取消打印任務,則直接點擊打印任務窗口中的“暫停”按鈕即可取消打印任務。也可能通過點擊Windows任務欄右下角的打印
    的頭像 發表于 04-12 16:10 ?6.8w次閱讀

    印過程中網會出現哪些故障

    絲網印刷是孔版印刷術中的一種主要印刷方法。印版呈網狀,印刷時印版上的油墨在刮墨板的擠壓下從版面通孔部分漏印至承印物上。網版方面的故障,有制網版時產生的問題,也有網印過程中網版產生的問題,本文僅就網印過程中網會出現哪些故障。
    的頭像 發表于 05-07 14:37 ?2846次閱讀

    膠印技術工藝參數會如何影響膠印過程

    在SMT貼片加工廠中,大多數使用膠印技術的客戶在錫膏印刷技術方面往往都是非常有經驗的。膠印技術相關工藝參數的確定可以以錫膏印刷技術的工藝參數作為參考。下面淺談印刷工藝參數是如何影響膠印過程的。
    的頭像 發表于 10-24 11:33 ?3381次閱讀

    3D打印過程中會遇到哪些問題

    3D打印俗稱增材制造,是一種可快速成型技術。它按照電子模型圖的指示,采用分層加工、疊加成形的方式逐層增加材料來打印目標物體。特別是在小批量生產中,3D打印是一種相對快速且經濟有效的生產方式零件符合
    的頭像 發表于 03-22 17:23 ?4421次閱讀

    計算機視覺算法在監測金屬3D打印過程中產生的缺陷

    卡內基梅隆大學工程學院(CMU)的兩位研究人員已經想出了如何將3D打印和機器學習結合起來進行實時過程監控,這種做法可以檢測出零件在3D打印過程中的異常情況。
    的頭像 發表于 12-26 12:51 ?554次閱讀

    如何避免3D打印機使用過程中出現拉絲

    當我們在使用3d打印打印模型時,打印過程中有時會在模型上出現絲狀塑料,尤其是當噴嘴從一端直接跳到另一端時。我們將3d打印過程中出現的這些細絲現象統稱為“拉絲”。在大多數3d
    發表于 09-10 16:33 ?3387次閱讀

    為什么在金屬 3D 打印過程中使用氧氣分析儀很重要?

    。對于航空航天、汽車和醫療等行業,產品的質量在金屬 3D 打印過程中不會因氧氣的存在而受損,這一點至關重要。
    的頭像 發表于 08-19 10:50 ?1254次閱讀
    為什么在金屬 3D <b class='flag-5'>打印過程</b>中使用氧氣分析儀很重要?

    晶振在3D打印技術中的應用都有哪些?

    3D打印過程中,需要進行大量的數據處理,包括模型的切片、打印路徑的規劃等。
    的頭像 發表于 03-17 11:29 ?592次閱讀
    主站蜘蛛池模板: yellow片在线观看免费观看动漫| 在线天天看片免费视频观看| 国产三级级在线电影| 亚洲精品tv久久久久久久久久| 久久亚洲AV成人无码动态图| av狼新人开放注册区| 亚洲AV福利天堂一区二区三| 欧美雌雄双性人交xxxx| 国语自产精品一区在线视频观看| beeg日本老师| 99无人区码一码二码三| 国产 亚洲 中文字幕 久久网| 2021自产拍在线观看视频| 午夜毛片在线观看| 日韩一区二区三区四区区区| 恋夜秀场支持安卓版全部视频国产| 国产精品九九久久精品视| 99无码熟妇丰满人妻啪啪| 国产成人在线播放视频| 大相蕉伊人狼人久草av| xxxx69日本| 菠萝菠萝蜜在线观看视频| 9位美女厕所撒尿11分| 国产精品18久久久久久欧美| 国产成人综合在线观看| 久久a级片| 蜜桃臀无码内射一区二区三区| 久久综合亚洲色hezyo| 欧美Av无码高清在线| 亚洲 天堂 国产在线播放| 99精品在线| 干性感美女| 国产亚洲精品久久久久久国模美| 国产亚洲视频在线播放香蕉| 久久99国产精品一区二区| 日日操夜夜摸| brazzers欧美最新版视频| 久久99精品国产99久久6男男| 色情内射少妇兽交| 亚洲AV永久无码精品澳门| 中文字AV字幕在线观看|