Spring Boot启动时如何自定义Banner横幅并显示专属Logo

来源:图像处理网作者:广州SEO公司头衔:草根站长
导读:本期聚焦于广州SEO公司创作的《Spring Boot启动时如何自定义Banner横幅并显示专属Logo》,敬请观看详情。启动Spring Boot应用时,控制台默认会打印一个Spring形状的字符画,这个输出其实可以完全换成自己的内容。自定义Banner不仅能展示项目名称、版本号、团队标识,还能在启动日志中突出个性化信息。实现方式主要有两种:在classpath下放置banner.txt文本文件,或者通过代码实现Banner接口动态生成内容。文本方式适合静态字符画,支持颜色和占位符变量;代码方式适合根据不同环境输出不同横幅,也能读取配置信息。除了文本,Spring Boot还能将图片转换成ASCII字符显示,但需要终端支持ANSI颜色。如果不想显示横幅,也可以通过配置关闭。这篇文章会从默认行为讲起,逐步演示文本、代码、图片三种自定义方案,以及启动时需要注意的字符编码和占位符细节。

Spring Boot应用在启动时,控制台打印的第一段内容就是Banner横幅。默认情况下,它会展示Spring的绿色字符画以及Spring Boot的版本信息。这个行为并不是写死在日志框架里的,而是Spring Boot提供的一个可扩展点。只要在正确的位置放置资源文件,或者注册一个Banner接口实现类,就可以把启动横幅替换成项目自己的Logo、名称、版本或者任意文本。对于需要区分环境或多模块部署的应用来说,自定义Banner还能帮助开发者在日志流中快速识别当前启动的是哪个服务。

Spring Boot启动时如何自定义Banner横幅并显示专属Logo

Spring Boot Banner的默认输出机制

Spring Boot在启动流程中会通过SpringApplication类的run方法触发banner打印。具体来说,SpringApplication会在环境准备完成之后、容器刷新之前,查找是否存在Banner接口的实现类。如果没有找到自定义实现,它会回到默认的SpringBootBanner,输出那个经典的Spring字符画。这个查找过程遵循一定的资源位置约定,classpath根目录下的banner.txt文件就是最常用的入口。

默认横幅的输出模式由spring.main.banner-mode属性控制,可以设置为console、log或者off。console表示打印到标准输出,log表示写入日志文件,off表示完全关闭。在实际项目中,如果应用运行在无交互的服务器环境,有时会因为日志采集系统重复收集控制台内容而选择把banner输出到log,或者直接关闭。banner-mode默认是console,因此大多数开发者第一次看到启动日志时,会先看到一段Spring符号。

除了banner.txt,Spring Boot还支持其他命名约定。classpath根目录下如果同时存在banner.txt和banner.png,Spring Boot会优先使用图片文件。图片会被转换成ASCII字符,并叠加颜色输出。对于文本横幅,可以通过banner.location指定一个非标准位置,例如classpath:config/banner.txt。需要注意的是,如果使用banner.location,Spring Boot不会再自动查找banner.txt,这一点在配置时容易忽略。

使用banner.txt实现静态字符横幅

最简单的自定义方式是在src/main/resources目录下新建banner.txt文件。文件内容会原样输出到控制台,因此可以直接把设计好的ASCII字符画粘贴进去。下面是一个简单的示例,输出项目名称和一行分隔线。这个文本可以在打包后随classpath一起分发,不依赖外部配置。

====================================
  MY PROJECT
  Version: 1.0.0
====================================

banner.txt不只是纯文本,Spring Boot还内置了一些占位符变量。常见的变量包括${spring-boot.version}、${spring-boot.formatted-version}、${application.title}和${application.version}。这些占位符的值来自环境配置,application.title对应spring.application.name,application.version对应spring.application.version。比如下面这段内容能让横幅动态显示应用名和版本,而不用修改字符画本身。

${spring-boot.formatted-version}
------------------------------------
Application: ${application.title}
Version: ${application.version}
------------------------------------

如果希望在终端中显示彩色横幅,可以使用ANSI颜色占位符。Spring Boot支持${AnsiColor.BRIGHT_RED}、${AnsiColor.GREEN}、${AnsiColor.YELLOW}等颜色常量,以及${AnsiStyle.BOLD}、${AnsiStyle.FAINT}等样式。颜色占位符需要放在文本之前,并且可以使用${AnsiColor.DEFAULT}恢复默认颜色。需要注意的是,ANSI颜色只有在支持ANSI转义序列的终端中才会正常显示,某些Windows控制台可能需要额外启用ANSI支持。

字符编码也是自定义banner时经常遇到的问题。如果字符画包含中文或特殊符号,需要确保banner.txt文件以UTF-8编码保存,并且可以在application.properties中设置banner.charset=UTF-8。如果文件编码与JVM默认编码不一致,控制台可能会出现乱码。建议在团队协作中统一编码规范,避免因为操作系统不同导致banner显示异常。

通过代码实现Banner接口动态生成横幅

对于需要根据不同环境输出不同内容的场景,静态banner.txt无法满足需求。这时可以实现org.springframework.boot.Banner接口,重写printBanner方法。这个方法的签名包含Environment、Class> sourceClass和PrintStream out三个参数,开发者可以从Environment中读取激活的Profile、自定义属性或者系统参数,然后通过out打印任意内容。下面是一个动态读取应用名称和环境的实现示例。

import java.io.PrintStream;
import org.springframework.boot.Banner;
import org.springframework.core.env.Environment;

public class CustomBanner implements Banner {

    @Override
    public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
        String appName = environment.getProperty("spring.application.name", "unknown-app");
        String profile = String.join(",", environment.getActiveProfiles());
        out.println("======================================");
        out.println("  " + appName.toUpperCase());
        out.println("  ACTIVE PROFILE: " + (profile.isEmpty() ? "default" : profile));
        out.println("======================================");
    }
}

要让这个实现生效,有两种注册方式。第一种是在SpringApplication对象上调用setBanner方法,这种方式适合Spring Boot应用入口比较固定的情况。第二种是把CustomBanner声明为Spring容器中的Bean,Spring Boot会优先查找类型为Banner的Bean并使用它。如果同时存在banner.txt文件和Banner Bean,代码实现的优先级更高。下面是通过入口类设置Banner的代码。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(DemoApplication.class);
        app.setBanner(new CustomBanner());
        app.run(args);
    }
}

代码方式的好处是灵活性高,可以读取数据库配置、远程配置中心或者环境变量中的内容,动态生成横幅。例如在微服务架构中,每个实例启动时可以在横幅中打印IP地址、端口号和实例标识,这样在滚动发布或排查问题时非常直观。缺点是需要编写Java代码,并且如果项目中有多个SpringApplication入口,需要分别设置,维护起来比一个banner.txt文件稍显繁琐。

图片横幅与关闭横幅的配置方式

除了文本和代码,Spring Boot还支持使用图片作为横幅。将名为banner.gif、banner.jpg或banner.png的图片放在classpath根目录,Spring Boot会自动将图片转换为ASCII字符输出。图片转换后的效果受到终端宽度、字符集和颜色深度影响,通常适合简单的Logo或几何图形。如果图片内容复杂,ASCII效果可能不够清晰。可以通过banner.image.width和banner.image.height调整输出宽度和高度,也可以通过banner.image.invert反转颜色。

图片横幅在日志文件或非彩色终端中的可读性通常不如文本横幅。如果团队主要使用文本日志分析工具,建议优先使用banner.txt。对于需要展示品牌标识的场景,可以在本地开发时使用图片横幅,在生产环境使用文本或直接关闭,以减少日志文件体积。关闭横幅最简单的方式是在application.properties中设置spring.main.banner-mode=off,或者在application.yml中写同样的配置。

spring:
  main:
    banner-mode: off

如果想要保留日志输出但不在控制台显示,可以将banner-mode设置为log。这样横幅会写入日志文件,而不会污染控制台输出。需要注意的是,日志模式依赖日志框架已经完成初始化,因此横幅可能不会出现在日志文件的最开头。无论选择哪种模式,自定义横幅都应该被视为启动信息的一部分,而不是业务日志。合理使用Banner能在开发阶段提供清晰的启动反馈,同时不会对应用性能产生影响。

Spring Boot Banner自定义横幅启动横幅修改时间:2026-09-30 01:27:06

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0930/63628.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。