当前位置: 首页 > news >正文

【本人秃顶程序员】SpringBoot基础之banner玩法解析

←←←←←←←←←←←← 快!点关注

SpringBoot项目启动时会在控制台打印一个默认的启动图案,这个图案就是我们要讲的banner。看似简单的banner,我们能够对它做些什么呢?本篇文章就带大家深入了解一下banner的使用(版本:SpringBoot2.1.4)。

制作自己的banner

第一步:在src/main/resources下面创建banner.txt。

第二步:访问网站http://patorjk.com/software/taag,在网站“Type Something ”处输入想要制作的单词(比如:Hello World),会生成对应的字符。也可以通过其他参数来调整字符的样式。

复制生成的字符,粘贴到banner.txt,再次启动程序便可以打印出指定的banner了。

个人比较喜欢的banner是如下图形:

${AnsiColor.BRIGHT_YELLOW}

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

复制代码

在新版本的SpringBoot中,支持了gif、jpg和png的图片形式的banner打印。当然,并不会把图片直接打印在控制台,而是将其像素解析转换成assii编码之后打印。

对于gif动图,会把动图的每个图片都打印出来,如果动图比较大,打印时间较长。可以尝试一下,但建议不要使用gif。

在banner.txt中,还可以进行一些设置,比如上图中的

  • ${AnsiColor.BRIGHT_YELLOW}。
  • ${AnsiColor.BRIGHT_RED}:设置控制台中输出内容的颜色
  • ${application.version}:用来获取MANIFEST.MF文件中的版本号
  • {application.formatted-version}:格式化后的{application.version}版本信息
  • ${spring-boot.version}:Spring Boot的版本号
  • {spring-boot.formatted-version}:格式化后的{spring-boot.version}版本信息

Banner接口

在未指定banner.txt或banner图片时,默认图形存储在哪里了呢?下面我们了解一下Banner接口。

@FunctionalInterface
public interface Banner {

  // 打印banner
  void printBanner(Environment environment, Class<?> sourceClass, PrintStream out);

  enum Mode {
    // 关闭
    OFF,
    // 控制台
    CONSOLE,
    // 日志文件
    LOG
  }
}
复制代码

在banner接口中提供了打印banner的方法和一个枚举类。枚举类有三个值:OFF、CONSOLE、LOG,用来控制banner的打印,分别对应:关闭打印、控制台打印和日志打印。

banner接口的实现主要有ResourceBanner、ImageBanner、SpringBootBanner和其他内部类的实现。其中上面看到的图形的打印就来自于SpringBootBanner。看一下源代码:

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;

  @Override
  public 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();
  }
}
复制代码

在printBanner的方法实现中,首先打印了默认的Banner字符串数组,然后将SPRING_BOOT和版本信息进行拼接打印。

Banner的参数设置

banner的参数设定可以通过两种形式,一种是代码的形式,一种是配置文件的形式。

使用代码的形式首先要将默认的main方法进行改造,手动创建SpringApplication对象,然后设置相应的参数。示例代码:

public static void main(String[] args) {

  SpringApplication app = new SpringApplication(SpringbootBannerApplication.class);
  app.setBannerMode(Banner.Mode.CONSOLE);

  Banner banner = new ImageBanner(new ClassPathResource("banner1.png"));
  app.setBanner(banner);
  app.run(args);
}
复制代码

通过配置文件设置就比较简单,直接在application.properties中进行配置,springboot已经帮我们预制好了相应的参数。

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
复制代码

其中spring.main.show-banner来控制是否打印banner,在新版本中不建议使用,可以使用spring.main.banner-mode代替,将其值设置为OFF即可关闭banner的打印。

引入文本banner通过spring.banner.location来指定,引入图片相关的banner需要通过spring.banner.image.location来指定路径,否则会出现乱码情况。

如果不想显示banner,可以在代码中通过setBannerMode(Banner.Mode.OFF)方法或通过参数配置spring.main.banner-mode=off来关闭banner的打印。上面示例中已经有所展示。

读者福利:

分享免费学习资料

针对于还会准备免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料) 为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

资料领取方式:加入粉丝群963944895,私信管理员即可免费领取

转载于:https://juejin.im/post/5ca9e9b3f265da250f243769

相关文章:

  • 红米6.0系统设备最完美激活Xposed框架的流程
  • 微软宣布Azure Functions正式支持Java
  • 常用网络设备
  • Mysql5.7 - 一键安装脚本
  • 一、python小功能记录——监听键盘事件
  • note_4.10
  • jstl使用中的错误----基于idea
  • python 计算机基础
  • 数据流中的中位数(未)
  • jeecg入门操作—菜单管理
  • 解决AutoComplete数据过多时的卡顿问题
  • postgresql行列转换函数
  • 怎么获取红米6 Pro的root权限
  • AAC架构系列一(初识)
  • Jboot 2.0.7 发布,分布式事务新增对 HikariCP、C3P0 等连接池的支持
  • 《Java编程思想》读书笔记-对象导论
  • angular2 简述
  • Effective Java 笔记(一)
  • jquery ajax学习笔记
  • JS基础之数据类型、对象、原型、原型链、继承
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • windows-nginx-https-本地配置
  • 彻底搞懂浏览器Event-loop
  • 对超线程几个不同角度的解释
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 记录:CentOS7.2配置LNMP环境记录
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 我是如何设计 Upload 上传组件的
  • 用element的upload组件实现多图片上传和压缩
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 《天龙八部3D》Unity技术方案揭秘
  • ionic异常记录
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​TypeScript都不会用,也敢说会前端?
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • %check_box% in rails :coditions={:has_many , :through}
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (3)nginx 配置(nginx.conf)
  • (39)STM32——FLASH闪存
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (论文阅读30/100)Convolutional Pose Machines
  • (转)详解PHP处理密码的几种方式
  • (转载)Linux网络编程入门
  • ***原理与防范
  • .Mobi域名介绍
  • .net 反编译_.net反编译的相关问题