javascript
定制自己的Springboot控制台输出广告横幅--banner
一、介紹
導讀:
好奇是最好的發現者,興趣是最好的導師,當你對大千代碼世界很好奇的時候,你就會主動去發現這個世界的奇妙,當你對程序感興趣的時候,你才能有能力去駕馭它。
大家的疑問
對于使用SpringBoot或使用SpringCloud項目開發的人來說,我們經常在啟動的時候,在控制臺打印如下橫幅廣告:
是不是很熟悉!是不是很親切!!那么,各位是否思考過這個看不起眼的小問題?這個廣告橫幅是如何打印出來的?
示例展示
示例一
如下我展示了一幅比較可愛的圖片,將一張gif動圖打印到控制臺中:
如果連續看一下,有沒有看到一男一女到熱舞?
示例二
自己創建banner文本"easystudy":
這是我自己定制的一個logo,可以有多種多樣的樣式:
.----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. | | | _________ | || | __ | || | _______ | || | ____ ____ | || | _______ | || | _________ | || | _____ _____ | || | ________ | || | ____ ____ | | | | |_ ___ | | || | / \ | || | / ___ | | || | |_ _||_ _| | || | / ___ | | || | | _ _ | | || ||_ _||_ _|| || | |_ ___ `. | || | |_ _||_ _| | | | | | |_ \_| | || | / /\ \ | || | | (__ \_| | || | \ \ / / | || | | (__ \_| | || | |_/ | | \_| | || | | | | | | || | | | `. \ | || | \ \ / / | | | | | _| _ | || | / ____ \ | || | '.___`-. | || | \ \/ / | || | '.___`-. | || | | | | || | | ' ' | | || | | | | | | || | \ \/ / | | | | _| |___/ | | || | _/ / \ \_ | || | |`\____) | | || | _| |_ | || | |`\____) | | || | _| |_ | || | \ `--' / | || | _| |___.' / | || | _| |_ | | | | |_________| | || ||____| |____|| || | |_______.' | || | |______| | || | |_______.' | || | |_____| | || | `.__.' | || | |________.' | || | |______| | | | | | || | | || | | || | | || | | || | | || | | || | | || | | | | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |'----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' ____ __ ___ _ _ ___ ____ __ __ ____ _ _ ( ___) /__\ / __)( \/ )/ __)(_ _)( )( )( _ \( \/ ))__) /(__)\ \__ \ \ / \__ \ )( )(__)( )(_) )\ / (____)(__)(__)(___/ (__) (___/ (__) (______)(____/ (__) _ _ | | | | ___ __ _ ___ _ _ ___| |_ _ _ __| |_ _ / _ \/ _` / __| | | / __| __| | | |/ _` | | | | | __/ (_| \__ \ |_| \__ \ |_| |_| | (_| | |_| |\___|\__,_|___/\__, |___/\__|\__,_|\__,_|\__, |__/ | __/ ||___/ |___/ ___ ,--.'|_ ,---, | | :,' ,--, ,---.'| .--.--. .--.--. : : ' : ,'_ /| | | : ,---. ,--.--. / / ' .--, / / '.;__,' / .--. | | : | | | .--, / \ / \ | : /`./ /_ ./|| : /`./| | | ,'_ /| : . | ,--.__| | /_ ./| / / | .--. .-. | | : ;_ , ' , ' :| : ;_ :__,'| : | ' | | . . / ,' |, ' , ' : . ' / | \__\/: . . \ \ `./___/ \: | \ \ `. ' : |__ | | ' | | |. ' / /___/ \: | ' ; /| ," .--.; | `----. \. \ ' | `----. \| | '.'|: | : ; ; |' ; |: |. \ ' | ' | / | / / ,. | / /`--' / \ ; : / /`--' /; : ;' : `--' \ | '/ ' \ ; : | : |; : .' \'--'. / \ \ ;'--'. / | , / : , .-./ : :| \ \ ; \ \ / | , .-./ `--'---' : \ \ `--'---' ---`-' `--`----' \ \ / : \ \ `----' `--`---' \ ' ; `----' \ ' ; `--` `--`以下有兩個常用制作banner的網站(字符畫生成的網站),地址如下:
http://www.network-science.de/ascii/ http://patorjk.com/software/taag/示例三
打印帶有顏色的字符畫
以上就是相關的介紹和示例。
二、配置與使用
在介紹了banner的示例之后,大家是不是有點心動,那么如何在自己的項目中配置自己的字符畫橫幅呢?接下來我就帶大家去介紹對應的配置。
首先呢,我們需要了解的是SpringBoot項目啟動會加載banner配置,它查找banner的順序是如下的:
- 在classPath下查找banner圖片,該圖片格式包括.gif、jpg、png格式的圖片(1-n幀) ,將這n幀圖片轉變為文字圖畫打印到控制臺
- 在第一步classpath下未找到banner圖片,此時會在classpath下查找banner.txt文件,將文件中的文本打印出來
- 如果classpath下都沒有找到,則使用SpringBoot默認的banner,該默認實現為SpringBootBanner類
1、使用配置方式打印橫幅
圖片文件配置
根據以上說的原理,我們將banner.gif|png|jpg圖片放到classpath下,然后啟動
然后啟動應用程序:
可以看到類路徑下的banner已經被識別并轉化為圖片打印,更有趣的是打印的文字圖有顏色(其實是將其像素解析轉換成assii編碼之后打印)!其實顏色是可以通過控制臺啟用的,如果不設置,默認是不啟用顏色的,配置如下:
spring:output: ansi: enabled: ALWAYS注意如果是gif圖片,它有n幀,這n幀都會被解析成文件圖按一幀一幀打印出來!耗費時間可能較長,所以不建議使用,如果你非要進行這個騷操作,也不是不行!
文本文件配置
如果banner下沒有圖片文件,那么就會搜索classpath下的名字為banner.txt文件,然后將banner的內容打印出來,所以我們可以將banner.txt文件放到類路徑下,banner.txt打印的文字圖可以使用如下兩個網站生成并粘貼到文件中,這里不再贅述:
http://www.network-science.de/ascii/ http://patorjk.com/software/taag/我制作的內容為easystudy,文件內容如下:
${AnsiColor.BRIGHT_RED}__ .___ ____ _____ _________.__. _______/ |_ __ __ __| _/__.__. _/ __ \\__ \ / ___< | |/ ___/\ __\ | \/ __ < | | \ ___/ / __ \_\___ \ \___ |\___ \ | | | | / /_/ |\___ |\___ >____ /____ >/ ____/____ > |__| |____/\____ |/ ____|\/ \/ \/ \/ \/ \/\/ ${AnsiColor.BRIGHT_BLUE} ::: 注冊服務 (版本號: ${application.version}) ::: \(^O^)/ Spring-Boot版本: ${spring-boot.version}如下所示:
啟動結果如下:
可以看到文本中的內容被打印出來的同時具有如下特點:
- 可以指定打印的顏色
- 也可以打印對應的環境變量(使用${}括起來),這里我們打印的是版本號
springboot為了打印的橫幅廣告看起來更美觀,還啟動了一個枚舉類AnsiColor,這個枚舉類可以控制banner.txt中文字的顏色,而且非常容易使用。 如可以AnsiColor.BRIGHTYELLOW、{AnsiColor.BRIGHT_YELLOW}、AnsiColor.BRIGHTY?ELLOW、{AnsiColor.BRIGHT_RED}、${AnsiColor.BRIGHT_BLUE},可以打印環境變量,如我在yml文件中配置如下變量:
my: name: 李祥祥email: lixx2048@163.com然后啟動控制臺打印:
__ .___ ____ _____ _________.__. _______/ |_ __ __ __| _/__.__. _/ __ \\__ \ / ___< | |/ ___/\ __\ | \/ __ < | | \ ___/ / __ \_\___ \ \___ |\___ \ | | | | / /_/ |\___ |\___ >____ /____ >/ ____/____ > |__| |____/\____ |/ ____|\/ \/ \/ \/ \/ \/\/ ::: 我是:李祥祥 ::: \(^O^)/ 聯系我:lixx2048@163.com注意:
顏色枚舉類只能控制其后的文本的顏色,如果其后再次遇到其他顏色則從遇到的開始變為另外配置的顏色
環境變量打印支持系統自定義的,也支持自己配置的(如properties文件或yaml文件配置)
系統常用變量如下所示,各個變量含義如下:
| ${application.version} | MANIFEST.MF?中定義的版本。如:1.0 |
| ${application.formatted-version} | MANIFEST.MF?中定義的版本,并添加一個?v?前綴。如:v1.0 |
| ${spring-boot.version} | Spring Boot 版本。如:2.1.1.RELEASE. |
| ${spring-boot.formatted-version} | Spring Boot 版本,并添加一個?v?前綴。如:v2.1.1.RELEASE |
| ${Ansi.NAME}?(or?${AnsiColor.NAME},?${AnsiBackground.NAME},?${AnsiStyle.NAME}) | ANSI 顏色、字體。更多細節,參考:AnsiPropertySource。 |
| ${application.title} | MANIFEST.MF?中定義的應用名。 |
默認配置
如果classpath下既不能找到對應圖片,也不能找到banner.txt配置文件。那么系統將自動使用springboot默認的配置,默認的配置是代碼實現的,默認使用SpringBootBanner類,它實現了Banner接口類,具體代碼如下:
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;@Overridepublic 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();} }通過代碼我們看到:
- SpringBootBanner打印了自己的logo文字圖案
- 獲取了SpringBoot的version并打印出來
- 設置了打印的顏色等信息
使用配置修改默認配置
通過以上了解,我們知道我們只需要將我們的banner.jpg|png|gif|txt放到classpath下即可,但是如果我們防止的路徑不在類路徑下或者目錄結構不是根目錄,那么我們就需要默認修改對應的banner配置了,可以在yaml中的spring.banner下進行配置。配置參數包括如下配置:
# banner 模式。有三種模式:console/log/off # console 打印到控制臺(通過 System.out) # log - 打印到日志中 # off - 關閉打印 spring.main.banner-mode = off # banner 文件編碼 spring.banner.charset = UTF-8 # banner 文本文件路徑 spring.banner.location = classpath:banner.txt # banner 圖像文件路徑(可以選擇 png,jpg,gif 文件) spring.banner.image.location = classpath:banner.gif used). # 圖像 banner 的寬度(字符數) spring.banner.image.width = 76 # 圖像 banner 的高度(字符數) spring.banner.image.height = # 圖像 banner 的左邊界(字符數) spring.banner.image.margin = 2 # 是否將圖像轉為黑色控制臺主題 spring.banner.image.invert = false注意:
如果需要關閉banner的打印,老版本中關閉使用"spring.main.show-banner=false"來關閉,新版本的SpringBoot配置不能使用以上配置,而是使用"spring.main.banner-mode=off"來關閉!
2、使用編碼方式配置
使用代碼關閉
除了使用配置文件配置是否展示Banner,方式如下:
spring:main:#老版本控制方式#show-banner: false#新版本控制方式:off|console|logbanner-mode: OFF我們還可以使用代碼對Banner顯示進行控制,我們直接在SpringApplication實例中配置即可。
@EnableEurekaServer // 開啟eureka服務 @SpringBootApplication public class RegisterServerApp {public static void main(String[] args) {//SpringApplication.run(RegisterServerApp.class, args);SpringApplication application = new SpringApplication(RegisterServerApp.class);application.setBannerMode(Banner.Mode.OFF);application.run(args);}}使用代碼實現
通過以上配置,我們也知道了SpringBoot會注冊一個默認的SpringBootBanner的單利Bean,用來在沒有找到banner的時候負責打印Banner信息。如果想完全定制自己的Banner,那么就需要通過代碼實現。通過SpringBootBanner實現類,我們知道SpringBoot提供了一個接口org.springframework.boot.Banner,我們只需要實現該接口的printBanner方法即可!實現完成之后,我們只需通過SpringApplication.setBanner方法注入到SpringBoot即可。 例如,我的實現如下:
package com.donwait;import java.io.PrintStream;import org.springframework.boot.Banner; import org.springframework.boot.SpringBootVersion; import org.springframework.boot.ansi.AnsiColor; import org.springframework.boot.ansi.AnsiOutput; import org.springframework.boot.ansi.AnsiStyle; import org.springframework.core.env.Environment;/*** @文件名稱: MyBanner.java* @功能描述: 自定義Banner實現* @版權信息: www.dondown.com* @編寫作者: lixx2048@163.com* @開發日期: 2020年7月17日* @歷史版本: V1.0*/ public class MyBanner implements Banner {private static final String[] BANNER = { "","| | | | | | | \\ \\ / / | | | |","| |__| | ___| | | ___ \\ \\ /\\ / /__ _ __| | __| |","| __ |/ _ \\ | |/ _ \\ \\ \\/ \\/ / _ \\| '__| |/ _` |","| | | | __/ | | (_) | \\ /\\ / (_) | | | | (_| |","|_| |_|\\___|_|_|\\___/ \\/ \\/ \\___/|_| |_|\\__,_|" };private static final String SPRING_BOOT = " :: Spring Boot :: ";private static final int STRAP_LINE_SIZE = 42;@Overridepublic void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {for (String line : BANNER) {out.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(" ");}out.println(AnsiOutput.toString(AnsiColor.GREEN, SPRING_BOOT,AnsiColor.DEFAULT, padding.toString(), AnsiStyle.FAINT, version));} }然后,我們在我們的啟動類中設置自己的Banner類:
| | | | | | | \ \ / / | | | | | |__| | ___| | | ___ \ \ /\ / /__ _ __| | __| | | __ |/ _ \ | |/ _ \ \ \/ \/ / _ \| '__| |/ _` | | | | | __/ | | (_) | \ /\ / (_) | | | | (_| | |_| |_|\___|_|_|\___/ \/ \/ \___/|_| |_|\__,_|:: Spring Boot :: (v2.0.4.RELEASE)可以看到,我們打印了一個“Hello World”出來。
如果我們僅僅是控制SpringBoot對應的Banner,也可以使用自帶的ImageBanner和TextBanner創建,然后設置到SpringBoot中。
package com.donwait;import org.springframework.boot.Banner; import org.springframework.boot.ImageBanner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; import org.springframework.core.io.ClassPathResource;@EnableEurekaServer // 開啟eureka服務 @SpringBootApplication public class RegisterServerApp {public static void main(String[] args) {//SpringApplication.run(RegisterServerApp.class, args);SpringApplication application = new SpringApplication(RegisterServerApp.class);application.setBannerMode(Banner.Mode.CONSOLE);application.setBanner(new ImageBanner(new ClassPathResource("banner1.jpg")));application.run(args);}}效果也是一樣的:
如使用文本文件Banner類:
import org.springframework.boot.ResourceBanner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; import org.springframework.core.io.ClassPathResource;@EnableEurekaServer // 開啟eureka服務 @SpringBootApplication public class RegisterServerApp {public static void main(String[] args) {//SpringApplication.run(RegisterServerApp.class, args);SpringApplication application = new SpringApplication(RegisterServerApp.class);application.setBannerMode(Banner.Mode.CONSOLE);//application.setBanner(new ImageBanner(new ClassPathResource("banner1.jpg")));application.setBanner(new ResourceBanner(new ClassPathResource("banner1.txt")));application.run(args);}}另外,我要說明重點提一下,如果在classpath下同時存在圖片和文本banner,那么會優先加載banner圖片打印,然后在加載文本文件banne.txt內容并打印。
通過工具我們可以看到Banner的實現類有5個:
- Banners
- ImageBanner
- PrintedBanner
- ResourceBanner
- SpringBootBanner
各個Banner的含義和使用感興趣的可以自己去研究一下,我這里不再叨擾!以上就是SpringBoot使用的全部內容,自己的總結,有問題的可以一起交流一下。
源碼獲取、合作、技術交流請獲取如下聯系方式:
QQ交流群:961179337
微信賬號:lixiang6153
公眾號:IT技術快餐
電子郵箱:lixx2048@163.com
總結
以上是生活随笔為你收集整理的定制自己的Springboot控制台输出广告横幅--banner的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 航拍服务价格表,航拍测绘怎么计费的
- 下一篇: 在Manjaro Linux( Arch