SpringBoot中是如何打印banner的呢?

简介: SpringBoot中是如何打印banner的呢?

SpringBoot中是如何打印banner的呢?我们如何自定义banner?


SpringApplication的printBanner方法如下所示,其是一个桥梁。进行了必要的判断后,获取resourceLoader 和bannerPrinter,然后将任务交给了bannerPrinter去处理。

Banner printedBanner = printBanner(environment);
private Banner printBanner(ConfigurableEnvironment environment) {
  // 默认是CONSOLE
  if (this.bannerMode == Banner.Mode.OFF) {
    return null;
  }
  // 获取资源加载器
  ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader
      : new DefaultResourceLoader(getClassLoader());
  // 获取banner打印器
  SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);
  if (this.bannerMode == Mode.LOG) {
    return bannerPrinter.print(environment, this.mainApplicationClass, logger);
  }
  // 交给banner打印器去处理
  return bannerPrinter.print(environment, this.mainApplicationClass, System.out);
}

使用banner打印器SpringApplicationBannerPrinter打印banner信息。

Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {
  //获取到banner 可能是banners哦
  Banner banner = getBanner(environment);
  // 触发其printBanner方法
  banner.printBanner(environment, sourceClass, out);
  return new PrintedBanner(banner, sourceClass);
}

① 获取banner

private Banner getBanner(Environment environment) {
  Banners banners = new Banners();
   // 如果图片banner存在则添加
  banners.addIfNotNull(getImageBanner(environment));
  // 如果文本banner存在则添加
  banners.addIfNotNull(getTextBanner(environment));
  // 如果不为空,直接返回
  if (banners.hasAtLeastOneBanner()) {
    return banners;
  }
  if (this.fallbackBanner != null) {
    return this.fallbackBanner;
  }
  // 返回默认banner
  return DEFAULT_BANNER;
}

搜索图片banner

如下所示,如果配置了路径则从路径下面获取;否则从系统资源路径(classpath)下尝试获取banner.jpg、banner.png、banner.gif。

private Banner getImageBanner(Environment environment) {
// 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;
  }
  for (String ext : IMAGE_EXTENSION) {
    Resource resource = this.resourceLoader.getResource("banner." + ext);
    if (resource.exists()) {
      return new ImageBanner(resource);
    }
  }
  return null;
}

搜索文本banner

如果spring.banner.location存在则尝试获取其下资源,否则l尝试获取banner.txt

//String  BANNER_LOCATION_PROPERTY = "spring.banner.location";
//String DEFAULT_BANNER_LOCATION = "banner.txt";
private Banner getTextBanner(Environment environment) {
  String location = environment.getProperty(BANNER_LOCATION_PROPERTY, DEFAULT_BANNER_LOCATION);
  Resource resource = this.resourceLoader.getResource(location);
  if (resource.exists()) {
    return new ResourceBanner(resource);
  }
  return null;
}

默认banner

也就是DEFAULT_BANNER,其就是一个SpringBootBanner实例。

private static final Banner DEFAULT_BANNER = new SpringBootBanner();

如下所示,是不是很熟悉?

② 打印banner

banner.printBanner(environment, sourceClass, out);

如果你拿到的banner是一个banners,也就是Banner.banners实例。如下所示,会获取内部维护的banners列表循环触发每个实例的printBanner方法。

@Override
public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
  for (Banner banner : this.banners) {
    banner.printBanner(environment, sourceClass, out);
  }
}

Banner有如下实现,本文这里是默认的SpringBootBanner 。

SpringBootBanner (org.springframework.boot)
PrintedBanner in SpringApplicationBannerPrinter (org.springframework.boot)
Banners in SpringApplicationBannerPrinter (org.springframework.boot)
ResourceBanner (org.springframework.boot)
ImageBanner (org.springframework.boot)

会打印出如下效果:

③ 自定义banner

如何自定义banner呢,看了流程之后就会发现很简单,你自定义一个banner.txt扔到classpath即可。


目录
相关文章
|
6月前
|
Java Spring
【SpringBoot】SpringBoot自定义banner,成千上万种可供选择,当然也可以自定义生成哦
【SpringBoot】SpringBoot自定义banner,成千上万种可供选择,当然也可以自定义生成哦
92 1
|
1月前
|
Java Spring
springboot自定义banner
springboot自定义banner
springboot自定义banner
|
7月前
|
Java 开发者 Spring
SpringBoot更换Banner图
SpringBoot更换Banner图
130 0
|
3月前
|
Dubbo Java 应用服务中间件
如何在 Spring Boot 中制作和管理 Banner:完全指南
在 Spring Boot 应用的初启页面展示独特的ASCII艺术品能够为您的应用增添特色,并为用户或开发者提供温馨的问候。这种ASCII图案常常蕴含着项目的名称、版本信息、以及作者等重要数据。除此之外,这样的欢迎页面还起到加强品牌形象的作用。
|
4月前
|
Java 程序员
springboot自定义更换启动banner动画
springboot自定义更换启动banner动画
35 0
springboot自定义更换启动banner动画
|
9月前
|
Java
SpringBoot 自定义banner (小彩蛋)
SpringBoot 自定义banner (小彩蛋)
63 0
|
9月前
|
Java Spring
springboot自定义Banner图(项目启动时打印的spring图)
springboot项目启动一般是以这种方式启动:SpringApplication.run(App.class);
|
Java Python
【笑小枫的SpringBoot系列】【七】SpringBoot控制台自定义banner
【笑小枫的SpringBoot系列】【七】SpringBoot控制台自定义banner
103 0
|
Java 程序员 Spring
SpringBoot自定义Banner
SpringBoot自定义Banner
103 0
SpringBoot自定义Banner
|
消息中间件 JSON 架构师
Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
技术向前的大船,浩浩荡荡不可逆。作为技术人,我们能做的是keep moving,不管是技术架构师还是业务架构师,还是开发工程师!
486 0
Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性