欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot之自定義Banner詳解

 更新時(shí)間:2021年09月10日 15:15:22   作者:2Y波波  
這篇文章主要介紹了SpringBoot之自定義Banner詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

1、在線生成banner網(wǎng)站

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

2、兩種自定義Banner方式

在自定義Banner之前,先剖析一下源碼,源碼跟蹤解析如下:

  • SpringBoot啟動的main方法
public static void main(String[] args) {
		SpringApplication springApplication = new SpringApplication(Application.class);
		//開啟Banner打印方式(OFF:關(guān)閉,CONSOLE:控制臺輸出,LOG:日志輸出)
		springApplication.setBannerMode(Mode.LOG);
		springApplication.run(args);
	}
  • SpringApplication.printBanner():
private Banner printBanner(ConfigurableEnvironment environment) {
       //是否開啟Banner模式
        if (this.bannerMode == Mode.OFF) {
            return null;
        } else {
            ResourceLoader resourceLoader = this.resourceLoader != null ? this.resourceLoader : new DefaultResourceLoader((ClassLoader)null);
            SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter((ResourceLoader)resourceLoader, this.banner);
            return this.bannerMode == Mode.LOG ? bannerPrinter.print(environment, this.mainApplicationClass, logger) : bannerPrinter.print(environment, this.mainApplicationClass, System.out);
        }
    }
  • SpringApplicationBannerPrinter.print()
Banner print(Environment environment, Class<?> sourceClass, Log logger) {
	   //調(diào)用getBanner()方法
        Banner banner = this.getBanner(environment);
        try {
            logger.info(this.createStringFromBanner(banner, environment, sourceClass));
        } catch (UnsupportedEncodingException var6) {
            logger.warn("Failed to create String for banner", var6);
        }
        return new SpringApplicationBannerPrinter.PrintedBanner(banner, sourceClass);
    }
  • SpringApplicationBannerPrinter.getBanner()
private Banner getBanner(Environment environment) {
    SpringApplicationBannerPrinter.Banners banners = new SpringApplicationBannerPrinter.Banners();
    //先獲取image類型的banner
    banners.addIfNotNull(this.getImageBanner(environment));
    //在獲取text類型的banner
    banners.addIfNotNull(this.getTextBanner(environment));
    if (banners.hasAtLeastOneBanner()) {
        // 如果至少有一個(gè),則返回
        // Banners 也實(shí)現(xiàn)了 Banner 接口,運(yùn)用了組合模式,實(shí)際上可同時(shí)打印圖片和文本 banner。
        return banners;
    } else {
         // 返回自定義的banner(this.fallbackBanner) 或者 springboot默認(rèn)的banner(DEFAULT_BANNER)
         // 默認(rèn)的banner類:SpringBootBanner。
         // 自定義的banner:需要我們仿照SpringBootBanner去自定義一個(gè)類
         
         //this.fallbackBanner: 表示自定義的banner,此參數(shù)可在springboot啟動類的main方法中設(shè)置,后續(xù)會介紹
         
         //   public static void main(String[] args) {
         //        SpringApplication springApplication = new SpringApplication(Application.class);
         //        springApplication.setBanner(new MyBanner());//自定義的banner
         //        springApplication.run(args);
         //   }
        
          return this.fallbackBanner != null ? this.fallbackBanner : DEFAULT_BANNER;
    }
}

解釋:banner的獲取方式有兩種,先獲取image類型的banner,然后獲取text類型的banner,如果至少有一個(gè),則執(zhí)行該banner,如果沒有,返回自定義的banner,如果自定義也沒有,則返回默認(rèn)

那么上述源碼中是如何獲取image類型和Text類型的banner呢?
SpringApplicationBannerPrinter.getImageBanner()
SpringApplicationBannerPrinter.getTextBanner()

//獲取Text類型的banner
private Banner getTextBanner(Environment environment) {
    //先從spring.banner.location路徑中去取,如果沒有,默認(rèn)banner.txt
    String location = environment.getProperty("spring.banner.location", "banner.txt");
    Resource resource = this.resourceLoader.getResource(location);
    try {
        if (resource.exists() && !resource.getURL().toExternalForm().contains("liquibase-core")) {
            return new ResourceBanner(resource);
        }
    } catch (IOException var5) {}
    return null;
}

//獲取image類型的banner
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

  • 可通過配置參數(shù) spring.banner.image.location 來指定
  • 可將名為 “banner.jpg” (哪幾種類型取決于ext常量的定義) 的文件放在classpath 目錄(src/main/resources)

基于文件的 banner

  • 可通過配置參數(shù) spring.banner.location 來指定
  • 可將名為 “banner.txt” 的文件放在 classpath 目錄(src/main/resources)

源碼分析完畢,那么如何去自定義呢?

第一種:配置方式(直接在properties或yml文件中進(jìn)行配置)
即配置 spring.banner.image.location 和 spring.banner.location路徑
或者
將 “圖片” 和 “banner.txt” 放在classpath 目錄中

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

第二種:自定義banner

import org.springframework.boot.Banner;
import org.springframework.boot.ansi.AnsiColor;
import org.springframework.boot.ansi.AnsiOutput;
import org.springframework.boot.ansi.AnsiStyle;
import org.springframework.core.env.Environment;
import java.io.PrintStream;
/** 自定義banner類
 * @author hb
 * @date 2021-09-09 10:39
 */
public class MyBanner implements Banner {

    private static final String[] BANNER = new String[]{"", "  .   ____          _            __ _ _", " /\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\", "( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\", " \\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )", "  '  |____| .__|_| |_|_| |_\\__, | / / / /", " =========|_|==============|___/=/_/_/_/"};

    public MyBanner() {
    }

    @Override
    public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
        String[] bannerArray = BANNER;
        int bannerLength = bannerArray.length;
        for(int i = 0; i < bannerLength; ++i) {
            String line = bannerArray[i];
            out.println(line);
        }
        out.println(AnsiOutput.toString(new Object[]{AnsiColor.GREEN, " :: Spring Boot :: ", AnsiColor.DEFAULT,  AnsiStyle.FAINT}));
        out.println();
    }
}

如何使用自定義Banner?
springboot啟動類中添加自定義banner

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
   public static void main(String[] args) {
      SpringApplication springApplication = new SpringApplication(Application.class);
      //添加自定義banner
      springApplication.setBanner(new MyBanner());
      springApplication.run(args);
   }
}

如果不想打印banner,可以在啟動類的main中,設(shè)置 springApplication.setBannerMode(Banner.Mode.OFF);
或者
通過參數(shù)配置spring.main.banner-mode=off來關(guān)閉banner的打印

3、控制banner樣式

Spring提供了三個(gè)枚舉類來設(shè)定字符的顏色,分別是:

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

4、顯示應(yīng)用信息

除了上面的指定樣式之外,還可以顯示一些與應(yīng)用相關(guān)的版本信息:

${application.version}   與 MANIFEST.MF文件中相同的版本號,比如1.5.4.RELEASE
${application.formatted-version}   格式化過的版本號就是加個(gè)v然后用括號包起來,比如(v1.5.4.RELEASE)
${application.title} 
${spring-boot.version} Spring Boot的版本
${spring-boot.formatted-version} 格式化過的版本

到此這篇關(guān)于SpringBoot之自定義Banner詳解的文章就介紹到這了,更多相關(guān)SpringBoot之自定義Banner內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟記錄

    使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟記錄

    這篇文章主要給大家介紹了關(guān)于使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟,Spring?MVC是一種基于MVC模式的框架,它是Spring框架的一部分,它提供了一種更簡單和更有效的方式來構(gòu)建Web應(yīng)用程序,需要的朋友可以參考下
    2024-05-05
  • Java訪問者模式實(shí)現(xiàn)優(yōu)雅的對象結(jié)構(gòu)處理

    Java訪問者模式實(shí)現(xiàn)優(yōu)雅的對象結(jié)構(gòu)處理

    Java訪問者模式是一種行為型設(shè)計(jì)模式,它通過將數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作分離,實(shí)現(xiàn)對復(fù)雜對象結(jié)構(gòu)的處理。它將數(shù)據(jù)結(jié)構(gòu)中的每個(gè)元素都轉(zhuǎn)換為訪問者能夠識別的形式,從而使得數(shù)據(jù)操作可以在不影響數(shù)據(jù)結(jié)構(gòu)的前提下進(jìn)行擴(kuò)展和變化
    2023-04-04
  • 識別率很高的java文字識別技術(shù)

    識別率很高的java文字識別技術(shù)

    這篇文章主要為大家詳細(xì)介紹了識別率很高的java文字識別技術(shù),親測,希望對大家有幫助,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 淺談Java中的分布式鎖

    淺談Java中的分布式鎖

    這篇文章主要介紹了淺談Java中的分布式鎖,為了保證一個(gè)方法或?qū)傩栽诟卟l(fā)情況下的同一時(shí)間只能被同一個(gè)線程執(zhí)行,在傳統(tǒng)單體應(yīng)用單機(jī)部署的情況下,可以使用Java并發(fā)處理相關(guān)的API(如ReentrantLock或Synchronized)進(jìn)行互斥控制,需要的朋友可以參考下
    2023-09-09
  • java編程幾行代碼實(shí)現(xiàn)買菜自由

    java編程幾行代碼實(shí)現(xiàn)買菜自由

    這篇文章主要為大家介紹了java編程幾行代碼實(shí)現(xiàn)買菜自由,需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能

    SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能

    這篇文章主要介紹了SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02
  • java實(shí)現(xiàn)ftp上傳 如何創(chuàng)建文件夾

    java實(shí)現(xiàn)ftp上傳 如何創(chuàng)建文件夾

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)ftp上傳的相關(guān)資料,教大家如何創(chuàng)建文件夾?具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • SpringBoot中@FeignClient 注解的作用

    SpringBoot中@FeignClient 注解的作用

    Feign可以幫助我們定義和實(shí)現(xiàn)服務(wù)之間的 RESTful 接口,使得服務(wù)之間的調(diào)用更加方便和可靠,本文主要介紹了SpringBoot中@FeignClient 注解的作用,感興趣的可以了解一下
    2024-06-06
  • Spring Boot使用Allatori代碼混淆的方法

    Spring Boot使用Allatori代碼混淆的方法

    這篇文章主要介紹了Spring Boot使用Allatori代碼混淆的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 布隆過濾器(Bloom Filter)的Java實(shí)現(xiàn)方法

    布隆過濾器(Bloom Filter)的Java實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄悸∵^濾器(Bloom Filter)的Java實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12

最新評論