springboot banner(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Spring Boot 应用启动时,我们常常会看到一系列由 ASCII 字符组成的欢迎信息,这些信息被称为 Spring Boot Banner。Banner 是应用启动时展示的“门面”,不仅包含版本信息、作者声明,还能通过自定义设计增强品牌辨识度或传递调试信息。对于编程初学者而言,掌握如何控制和设计 Banner 是理解 Spring Boot 核心机制的入门实践;而中级开发者则可以通过高级技巧实现动态 Banner 或环境适配功能。本文将从基础概念到实战案例,逐步解析如何玩转 Spring Boot Banner


什么是 Spring Boot Banner?

Banner 是 Spring Boot 应用启动时输出的文本信息,通常包含以下内容:

  • 应用名称和版本号
  • Spring Boot 框架版本
  • 自定义的欢迎语或版权信息
  • 调试信息(如启动时间、配置参数)

例如,一个默认的 Spring Boot 应用启动时会显示类似以下内容:

  .   ____          _            __ _ _  
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \  
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \  
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  
  '  |____| .__|_| |_|_| |_\__, | / / / /  
 =========|_|==============|___/=/_/_/_/  
 :: Spring Boot ::                (v3.0.0)  

Banner 的作用类似于网站的 Logo 或 App 的启动画面,通过视觉化元素传递关键信息。但它的灵活性远超静态图片,支持文本、颜色和动态内容,是开发者展示个性或功能的窗口。


如何自定义 Banner?

1. 禁用默认 Banner

最基础的操作是完全关闭 Banner。在 application.properties 中添加以下配置:

spring.main.banner-mode=off  

此时应用启动时将不再显示任何 Banner 信息,适合追求极简输出的场景。

2. 使用纯文本文件替换默认 Banner

Spring Boot 允许通过 banner.txt 文件覆盖默认内容。操作步骤如下:

  1. 在项目资源目录(src/main/resources)下创建 banner.txt 文件。
  2. 在文件中编写任意文本内容,支持换行和特殊字符。

示例 banner.txt 内容

 _______  _______  _______ _________   _______  
(  ____ \(  ___  )(  ___  )\__   __/   (  ____ \  
| (    \/| (   ) || (   ) |   ) (      | (    \/  
| (_____ | (___) || (___) |   | |      | (_____  
(_____  )|  ___  ||  ___  |   | |       _____  )  
      ) || (   ) || (   ) |   | |      |  _____)  
/\____) || )   ( || )   ( |   | |      | |      
\_______)|/     \||/     \|   )_(      )_(      

启动应用后,将看到自定义的 ASCII 艺术图案。这种实现方式简单直接,适合快速上手。


3. 通过 Java 代码动态生成 Banner

对于需要动态内容(如时间戳、环境变量)的场景,可以通过实现 org.springframework.boot.Banner 接口自定义逻辑。

步骤

  1. 创建一个实现 Banner 接口的类:
import org.springframework.boot.Banner;  
import java.io.PrintStream;  

public class CustomBanner implements Banner {  
    @Override  
    public void printBanner(Environment environment, Class<?> source, PrintStream out) {  
        out.println("自定义 Banner 开始");  
        out.println("当前环境:" + environment.getProperty("spring.profiles.active"));  
        out.println("当前时间:" + System.currentTimeMillis());  
        out.println("自定义 Banner 结束");  
    }  
}  
  1. 在主类中通过 SpringApplication 配置该 Banner:
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  

@SpringBootApplication  
public class SpringBootBannerApplication {  
    public static void main(String[] args) {  
        SpringApplication application = new SpringApplication(SpringBootBannerApplication.class);  
        application.setBanner(new CustomBanner());  
        application.run(args);  
    }  
}  

运行后,输出将包含环境变量和实时时间,如:

自定义 Banner 开始  
当前环境:dev  
当前时间:1717023456789  
自定义 Banner 结束  

4. 混合使用文本与代码逻辑

若需结合静态文本和动态内容,可将 banner.txt 与代码逻辑结合。例如,在 CustomBanner 类中读取文本文件并拼接动态信息:

public class HybridBanner implements Banner {  
    @Override  
    public void printBanner(Environment env, Class<?> source, PrintStream out) {  
        // 读取 banner.txt 内容  
        try (InputStream input = this.getClass().getResourceAsStream("/banner.txt")) {  
            if (input != null) {  
                byte[] bytes = new byte[input.available()];  
                input.read(bytes);  
                out.write(bytes);  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  

        // 添加动态信息  
        out.println("运行环境:" + env.getProperty("spring.profiles.active"));  
    }  
}  

高级技巧与最佳实践

1. 根据环境切换 Banner

通过 Environment 对象判断激活的 Profile,动态选择不同的 Banner:

public class ProfileAwareBanner implements Banner {  
    @Override  
    public void printBanner(Environment env, Class<?> source, PrintStream out) {  
        String profile = env.getProperty("spring.profiles.active");  
        if ("prod".equals(profile)) {  
            out.println("生产环境 Banner");  
        } else {  
            out.println("开发环境 Banner");  
        }  
    }  
}  

2. 使用 ANSI 颜色增强视觉效果

ANSI 转义码可为文本添加颜色和样式。例如,在 banner.txt 中添加:

\033[31m红色文字\033[0m  
\033[34m蓝色文字\033[0m  
ANSI 代码效果
31红色
34蓝色
0重置默认颜色

3. 通过配置文件控制 Banner 位置

application.properties 中调整 Banner 的输出位置:

spring.main.banner-captured=true  

常见问题与解决方案

问题 1:自定义 Banner 未生效

原因:可能未正确配置 banner.txt 的位置,或代码实现时未通过 SpringApplication 设置。
解决

  • 确保 banner.txt 存在于 src/main/resources 目录。
  • 检查代码中是否遗漏 application.setBanner() 的调用。

问题 2:Banner 文字显示乱码

原因:文件编码格式与项目设置不一致(如使用 GBK 而非 UTF-8)。
解决

  • banner.txt 的编码格式改为 UTF-8。
  • 在 IDE 中设置项目编码为 UTF-8。

问题 3:Banner 过大影响启动速度

原因:过长的文本或复杂计算导致启动延迟。
解决

  • 精简 Banner 内容,避免嵌套多层 ASCII 图案。
  • 在生产环境通过 banner-mode=off 关闭 Banner。

结论

Spring Boot Banner 是一个容易被低估却极具潜力的功能模块。通过本文的讲解,读者可以掌握从基础禁用到高级动态生成的完整实现路径。无论是通过文本文件快速替换,还是通过代码实现环境感知,Banner 都能帮助开发者提升应用的可维护性和品牌价值。

对于初学者,建议从 banner.txt 入手,体验静态内容的修改;中级开发者可尝试结合 Environment 对象实现环境适配逻辑。随着对 Spring Boot 核心机制的深入理解,Banner 还可作为调试信息输出的载体,成为开发流程中的得力助手。

通过合理设计和利用 Banner,每个 Spring Boot 应用都能拥有独特的“启动仪式”,让代码不仅高效运行,更能传递开发者的心意与创意。

最新发布