请选择 进入手机版 | 继续访问电脑版

[java] SpringBoot之自定义Banner详解

[复制链接]
查看85 | 回复15 | 2021-9-13 01:49:55 | 显示全部楼层 |阅读模式

1、在线天生 banner网站

  1. https://www.bootschool.net/ascii
  2. http://www.network-science.de/ascii/
  3. http://patorjk.com/software/taag/
  4. http://www.degraeve.com/img2txt.php
复制代码

2、两种自定义Banner方式

在自定义Banner之前,先分析 一下源码,源码跟踪分析 如下:

  • SpringBoot启动的main方法
  1. public static void main(String[] args) {
  2. SpringApplication springApplication = new SpringApplication(Application.class);
  3. //开启Banner打印方式(OFF:关闭,CONSOLE:控制台输出,LOG:日志输出)
  4. springApplication.setBannerMode(Mode.LOG);
  5. springApplication.run(args);
  6. }
复制代码
  • SpringApplication.printBanner():
  1. private Banner printBanner(ConfigurableEnvironment environment) {
  2. //是否开启Banner模式
  3. if (this.bannerMode == Mode.OFF) {
  4. return null;
  5. } else {
  6. ResourceLoader resourceLoader = this.resourceLoader != null ? this.resourceLoader : new DefaultResourceLoader((ClassLoader)null);
  7. SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter((ResourceLoader)resourceLoader, this.banner);
  8. return this.bannerMode == Mode.LOG ? bannerPrinter.print(environment, this.mainApplicationClass, logger) : bannerPrinter.print(environment, this.mainApplicationClass, System.out);
  9. }
  10. }
复制代码
  • SpringApplicationBannerPrinter.print()
  1. Banner print(Environment environment, Class<?> sourceClass, Log logger) {
  2. //调用getBanner()方法
  3. Banner banner = this.getBanner(environment);
  4. try {
  5. logger.info(this.createStringFromBanner(banner, environment, sourceClass));
  6. } catch (UnsupportedEncodingException var6) {
  7. logger.warn("Failed to create String for banner", var6);
  8. }
  9. return new SpringApplicationBannerPrinter.PrintedBanner(banner, sourceClass);
  10. }
复制代码
  • SpringApplicationBannerPrinter.getBanner()
  1. private Banner getBanner(Environment environment) {
  2. SpringApplicationBannerPrinter.Banners banners = new SpringApplicationBannerPrinter.Banners();
  3. //先获取image类型的banner
  4. banners.addIfNotNull(this.getImageBanner(environment));
  5. //在获取text类型的banner
  6. banners.addIfNotNull(this.getTextBanner(environment));
  7. if (banners.hasAtLeastOneBanner()) {
  8. // 如果至少有一个,则返回
  9. // Banners 也实现了 Banner 接口,运用了组合模式,实际上可同时打印图片和文本 banner。
  10. return banners;
  11. } else {
  12. // 返回自定义的banner(this.fallbackBanner) 或者 springboot默认的banner(DEFAULT_BANNER)
  13. // 默认的banner类:SpringBootBanner。
  14. // 自定义的banner:需要我们仿照SpringBootBanner去自定义一个类
  15. //this.fallbackBanner: 表示自定义的banner,此参数可在springboot启动类的main方法中设置,后续会介绍
  16. // public static void main(String[] args) {
  17. // SpringApplication springApplication = new SpringApplication(Application.class);
  18. // springApplication.setBanner(new MyBanner());//自定义的banner
  19. // springApplication.run(args);
  20. // }
  21. return this.fallbackBanner != null ? this.fallbackBanner : DEFAULT_BANNER;
  22. }
  23. }
复制代码

表明 :banner的获取方式有两种,先获取image范例 的banner,然后获取text范例 的banner,假如 至少有一个,则实行 该banner,假如 没有,返回自定义的banner,假如 自定义也没有,则返回默认

那么上述源码中是怎样 获取image范例 和Text范例 的banner呢?
SpringApplicationBannerPrinter.getImageBanner()
SpringApplicationBannerPrinter.getTextBanner()

  1. //获取Text类型的banner
  2. private Banner getTextBanner(Environment environment) {
  3. //先从spring.banner.location路径中去取,如果没有,默认banner.txt
  4. String location = environment.getProperty("spring.banner.location", "banner.txt");
  5. Resource resource = this.resourceLoader.getResource(location);
  6. try {
  7. if (resource.exists() && !resource.getURL().toExternalForm().contains("liquibase-core")) {
  8. return new ResourceBanner(resource);
  9. }
  10. } catch (IOException var5) {}
  11. return null;
  12. }
  13. //获取image类型的banner
  14. private Banner getImageBanner(Environment environment) {
  15. String location = environment.getProperty("spring.banner.image.location");
  16. if (StringUtils.hasLength(location)) {
  17. Resource resource = this.resourceLoader.getResource(location);
  18. return resource.exists() ? new ImageBanner(resource) : null;
  19. } else {
  20. String[] var3 = IMAGE_EXTENSION;
  21. int var4 = var3.length;
  22. for(int var5 = 0; var5 < var4; ++var5) {
  23. String ext = var3[var5];
  24. Resource resource = this.resourceLoader.getResource("banner." + ext);
  25. if (resource.exists()) {
  26. return new ImageBanner(resource);
  27. }
  28. }
  29. return null;
  30. }
  31. }
复制代码

基于图片的 banner

  • 可通过设置 参数 spring.banner.image.location 来指定
  • 可将名为 “banner.jpg” (哪几种范例 取决于ext常量的定义) 的文件放在classpath 目次 (src/main/resources)

基于文件的 banner

  • 可通过设置 参数 spring.banner.location 来指定
  • 可将名为 “banner.txt” 的文件放在 classpath 目次 (src/main/resources)
  1. <strong>源码分析完毕,那么如何去自定义呢?</strong>
复制代码

第一种:设置 方式(直接在properties或yml文件中举行 设置 )
即设置 spring.banner.image.location 和 spring.banner.location路径
或者
将 “图片” 和 “banner.txt” 放在classpath 目次 中

  1. spring.banner.location=classpath:banner1.png
  2. spring.banner.image.margin=2
  3. spring.banner.image.height=76
  4. spring.banner.charset=UTF-8
  5. spring.banner.image.invert=false
  6. spring.banner.image.location=banner1.png
  7. spring.main.banner-mode=console
  8. spring.main.show-banner=true
复制代码

第二种:自定义banner

  1. import org.springframework.boot.Banner;
  2. import org.springframework.boot.ansi.AnsiColor;
  3. import org.springframework.boot.ansi.AnsiOutput;
  4. import org.springframework.boot.ansi.AnsiStyle;
  5. import org.springframework.core.env.Environment;
  6. import java.io.PrintStream;
  7. /** 自定义banner类
  8. * @author hb
  9. * @date 2021-09-09 10:39
  10. */
  11. public class MyBanner implements Banner {
  12. private static final String[] BANNER = new String[]{"", " . ____ _ __ _ _", " /\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \", "( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \", " \\\\/ ___)| |_)| | | | | || (_| | ) ) ) )", " ' |____| .__|_| |_|_| |_\\__, | / / / /", " =========|_|==============|___/=/_/_/_/"};
  13. public MyBanner() {
  14. }
  15. @Override
  16. public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
  17. String[] bannerArray = BANNER;
  18. int bannerLength = bannerArray.length;
  19. for(int i = 0; i < bannerLength; ++i) {
  20. String line = bannerArray[i];
  21. out.println(line);
  22. }
  23. out.println(AnsiOutput.toString(new Object[]{AnsiColor.GREEN, " :: Spring Boot :: ", AnsiColor.DEFAULT, AnsiStyle.FAINT}));
  24. out.println();
  25. }
  26. }
复制代码

怎样 利用 自定义Banner?
springboot启动类中添加自定义banner

  1. @SpringBootApplication
  2. public class Application extends SpringBootServletInitializer {
  3. public static void main(String[] args) {
  4. SpringApplication springApplication = new SpringApplication(Application.class);
  5. //添加自定义banner
  6. springApplication.setBanner(new MyBanner());
  7. springApplication.run(args);
  8. }
  9. }
复制代码

假如 不想打印banner,可以在启动类的main中,设置 springApplication.setBannerMode(Banner.Mode.OFF);
或者
通过参数设置 spring.main.banner-mode=off来关闭banner的打印

3、控制banner样式

Spring提供了三个摆列 类来设定字符的颜色,分别是:

  1. AnsiColor: 用来设定字符的前景色
  2. AnsiBackground: 用来设定字符的背景色
  3. AnsiStyle: 用来控制加粗、斜体、下划线等等。
复制代码

4、表现 应用信息

除了上面的指定样式之外,还可以表现 一些与应用相干 的版本信息:

  1. ${application.version} 与 MANIFEST.MF文件中相同的版本号,比如1.5.4.RELEASE
  2. ${application.formatted-version} 格式化过的版本号就是加个v然后用括号包起来,比如(v1.5.4.RELEASE)
  3. ${application.title}
  4. ${spring-boot.version} Spring Boot的版本
  5. ${spring-boot.formatted-version} 格式化过的版本
复制代码

到此这篇关于SpringBoot之自定义Banner详解的文章就先容 到这了,更多相干 SpringBoot之自定义Banner内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 123457524 | 2021-9-19 13:32:01 | 显示全部楼层
精神病院在通缉admin楼主!
回复

使用道具 举报

强,我和我的小伙伴们都惊呆了!
回复

使用道具 举报

avatar 天褐女孩涛 | 2021-9-23 09:22:23 | 显示全部楼层
admin楼主说的我也略懂!
回复

使用道具 举报

avatar 我是的十八簿 | 2021-9-26 17:42:39 | 显示全部楼层
今天皮痒了?
回复

使用道具 举报

avatar 数脚趾头耍媳 | 2021-10-4 09:47:46 | 显示全部楼层
admin楼主的病历本丢我这里了!
回复

使用道具 举报

avatar 马小心小a | 2021-10-6 16:08:58 | 显示全部楼层
这么版块的帖子越来越有深度了!
回复

使用道具 举报

avatar 痴痴情先生先s | 2021-10-7 13:31:11 | 显示全部楼层
小弟默默的路过贵宝地~~~
回复

使用道具 举报

avatar AriesHun | 2021-10-14 13:03:47 | 显示全部楼层
支持一下,下面的保持队形!
回复

使用道具 举报

写得实在太好了,我唯一能做的就是默默顶贴!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则