使用过 Springboot 的对上面这个图案肯定不会陌生,Springboot 启动的同时会打印上面的图案,并带有版本号。查看官方文档可以找到关于 banner 的描述
The banner that is printed on start up can be changed by adding a banner.txt file to your classpath or by setting the spring.banner.location property to the location of such a file. If the file has an encoding other than UTF-8, you can set spring.banner.charset. In addition to a text file, you can also add a banner.gif, banner.jpg, or banner.png image file to your classpath or set the spring.banner.image.location property. Images are converted into an ASCII art representation and printed above any text banner.
就不翻译了,直接有道翻译贴过来看个大概意思。
可以通过向类路径中添加一个banner.txt文件或设置spring.banner来更改在start up上打印的banner。属性指向此类文件的位置。如果文件的编码不是UTF-8,那么可以设置spring.banner.charset。除了文本文件,还可以添加横幅。将gif、banner.jpg或banner.png图像文件保存到类路径或设置spring.banner.image。位置属性。图像被转换成ASCII艺术形式,并打印在任何文本横幅上面。
1. 自定义 banner根据官方的描述,可以在类路径中自定义 banner 图案,我们进行尝试在放 resouce 目录下新建文件 banner.txt 并写入内容()。
(_) _ __ _ _ _ _ __ ___ ___ ___ | '_ \| | | | | '_ ` _ \ / _ \ / _ \ | | | | | |_| | | | | | | (_) | (_) | |_| |_|_|\__,_|_| |_| |_|\___/ \___/ 版本:${spring-boot.formatted-version}启动 Springboot 在控制台看到下面的输出。
(_) _ __ _ _ _ _ __ ___ ___ ___ | '_ \| | | | | '_ ` _ \ / _ \ / _ \ | | | | | |_| | | | | | | (_) | (_) | |_| |_|_|\__,_|_| |_| |_|\___/ \___/ 版本:(v2.1.3.RELEASE) 2019-02-25 14:00:31.289 INFO 12312 --- [ main] net.codingme.banner.BannerApplication : Starting BannerApplication on LAPTOP-L1S5MKTA with PID 12312 (D:\IdeaProjectMy\springboot-git\springboot-banner\target\classes started by Niu in D:\IdeaProjectMy\springboot-git\springboot-banner) 2019-02-25 14:00:31.291 INFO 12312 --- [ main] net.codingme.banner.BannerApplication : No active profile set, falling back to default profiles: default 2019-02-25 14:00:32.087 INFO 12312 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)发现自定义 banner 已经生效了,官方文档的介绍里说还可以放置图片,下面放置图片 banner.jpg 测试。
网上随便找了一个图片。
Springboot 把图案转成了 ASCII 图案。 2. ASCII 图案生成原理
看了上面的例子,发现 Springboot 可以把图片转换成 ASCII 图案,那么它是怎么做的呢?我们或许可以想象出一个大概流程。
获取图片。
遍历图片像素点。
分析像素点,每个像素点根据颜色深度得出一个值,根据明暗度匹配不同的字符。
输出图案。
Springboot 对图片 banner 的处理到底是不是我们上面想想的那样呢?直接去源码中寻找答案。
/** 位置:org.springframework.boot.SpringApplicationBannerPrinter */ //方法1: public Banner print(Environment environment, Class<?> sourceClass, Log logger) { // 获取 banner 调用方法记为2 Banner banner = getBanner(environment); try { logger.info(createStringFromBanner(banner, environment, sourceClass)); } catch (UnsupportedEncodingException ex) { logger.warn("Failed to create String for banner", ex); } // 打印 banner return new PrintedBanner(banner, sourceClass); } // 方法2 private Banner getBanner(Environment environment) { Banners banners = new Banners(); // 获取图片banner,我们只关注这个,调用方法记为3 banners.addIfNotNull(getImageBanner(environment)); banners.addIfNotNull(getTextBanner(environment)); if (banners.hasAtLeastOneBanner()) { return banners; } if (this.fallbackBanner != null) { return this.fallbackBanner; } return DEFAULT_BANNER; } // 方法3 /** 获取自定义banner文件信息 */ private Banner getImageBanner(Environment environment) { // BANNER_IMAGE_LOCATION_PROPERTY = "spring.banner.image.location"; 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; } // IMAGE_EXTENSION = { "gif", "jpg", "png" }; for (String ext : IMAGE_EXTENSION) { Resource resource = this.resourceLoader.getResource("banner." + ext); if (resource.exists()) { return new ImageBanner(resource); } } return null; }