自定义 Banner 与启动信息
本教程共 48 篇 · 第 16 篇 · 更新于 2026-08-13 · 约 4 分钟阅读
本节目标:换掉默认的 Spring 艺术字 Banner,掌握关闭方式,再学会在启动完成后执行自定义逻辑。
默认 Banner 长什么样
每次启动,控制台先打一个大大的 Spring 艺术字。
那是 Spring Boot 的默认 Banner,纯装饰,但能调。
想换成自己的文字、团队 Logo,或者干脆关掉,都行。
自定义文本 Banner
在 src/main/resources 下新建 banner.txt,内容随意:
============================
HELLO SPRING BOOT
Author: 码上学
============================
Spring Boot 启动时会自动找这个文件,替换默认 Banner。
去网上搜「ASCII art generator」,把生成的文字贴进来,效果更酷。
Tip中文艺术字生成器质量参差,用英文短词效果最稳。
换 Banner 文件位置
不想用默认位置?指定路径:
spring:
banner:
location: classpath:banner/my-banner.txt
文件编码不是 UTF-8 时,指定字符集:
spring:
banner:
location: classpath:banner/my-banner.txt
charset: UTF-8
Banner 里用占位符
Banner 文件支持占位符,能显示版本信息:
============================
HELLO SPRING BOOT
============================
Version: ${application.version}
Spring Boot: ${spring-boot.version}
支持的占位符:
${application.title}:应用标题,来自 MANIFEST.MF。${application.version}:应用版本号。${application.formatted-version}:格式化版本号,显示为(v1.0)。${spring-boot.version}:Spring Boot 版本,如4.1.0。${spring-boot.formatted-version}:格式化版本。${AnsiColor.RED}等:ANSI 颜色控制。
${AnsiColor.GREEN}
============================
HELLO SPRING BOOT
${AnsiColor.DEFAULT}
Warning
${application.version}来自打包后的 MANIFEST.MF。IDE 里直接 run 拿不到,得先mvn package再java -jar运行才显示。
关闭 Banner
三种方式,任选其一。
方式一:配置文件
spring:
main:
banner-mode: off
banner-mode 有三个值:
console:打印到控制台(默认)。log:作为日志输出。off:不打印。
方式二:代码里关
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.setBannerMode(Banner.Mode.OFF);
application.run(args);
}
}
方式三:SpringApplicationBuilder
import org.springframework.boot.Banner;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.bannerMode(Banner.Mode.OFF)
.run(args);
}
}
Note版本对照:Spring Boot 2.x 还支持图片 Banner(
banner.gif/banner.png/banner.jpg)。3.0 M2 起图片 Banner 已移除,只剩文本 Banner。看到旧教程教图片 Banner,跳过即可。
程序化生成 Banner
连文本文件都嫌麻烦?实现 Banner 接口:
import java.io.PrintStream;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.setBanner(new Banner() {
@Override
public void printBanner(Environment environment, Class<?> sourceClass,
PrintStream out) {
out.println("=== 自定义 Banner 输出 ===");
out.println("应用名: " + environment.getProperty("spring.application.name"));
}
});
application.run(args);
}
}
适合 Banner 内容要动态计算的场景。
启动完成后做点什么
Banner 只是门面。真正常用的是「启动完成后执行一段逻辑」。
比如启动时打印配置、预热缓存、检查依赖。
方式一:ApplicationRunner
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class StartupRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("应用启动完成,参数:" + args.getOptionNames());
}
}
方式二:CommandLineRunner
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class StartupRunner implements CommandLineRunner {
@Override
public void run(String... args) {
System.out.println("应用启动完成,原始参数:" + String.join(", ", args));
}
}
两者区别在参数形态:
- CommandLineRunner 拿到原始字符串数组。
- ApplicationRunner 拿到包装好的 ApplicationArguments,支持
--key=value解析。
多个 Runner 时用 @Order 控制顺序:
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@Order(1)
public class FirstRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("先执行");
}
}
NoteRunner 在应用上下文刷新完成、Web 服务启动之后执行。此时 Bean 都已就绪,可以放心注入使用。
方式三:监听 ApplicationReadyEvent
更底层的做法,监听事件:
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class ReadyListener {
@EventListener(ApplicationReadyEvent.class)
public void onReady() {
System.out.println("ApplicationReadyEvent 已触发");
}
}
用注解注册监听器,省去实现接口的样板代码。
启动事件体系
Runner 和 ReadyEvent 之外,Spring Boot 还发布一串启动事件。
按发生顺序:
ApplicationStartingEvent:启动刚开始,连 Environment 都还没建。ApplicationEnvironmentPreparedEvent:Environment 就绪。ApplicationContextInitializedEvent:上下文创建完成。ApplicationPreparedEvent:刷新前,Bean 定义已加载。ApplicationStartedEvent:上下文刷新完成,Runner 执行前。ApplicationReadyEvent:全部就绪,可以对外服务。ApplicationFailedEvent:启动失败。
按需监听对应阶段:
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class StartedListener {
@EventListener(ApplicationStartedEvent.class)
public void onStarted() {
System.out.println("上下文已刷新,Runner 还没跑");
}
}
Note极早期的监听器(Starting、EnvironmentPrepared)建议用
SpringApplication.addListeners(...)注册,靠 @Component 可能来不及加载。
回调方式怎么选
三种姿势各有适用场景:
- CommandLineRunner:要拿原始命令行参数。
- ApplicationRunner:要解析
--key=value形式的参数。 - ApplicationReadyEvent:要监听多个阶段,或者只关心就绪瞬间。
多个回调的先后顺序用 @Order 控制。数字小的先执行。
实现 Ordered 接口效果一样:
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
@Component
public class OrderedRunner implements CommandLineRunner, Ordered {
@Override
public void run(String... args) {
System.out.println("按 Ordered 排序执行");
}
@Override
public int getOrder() {
return 10;
}
}
Runner 里抛异常会导致启动失败。初始化逻辑要捕获处理,别让一个小预热把服务搞挂。
SpringApplicationBuilder 更多用法
前面用它关 Banner。它还能做更多:
import org.springframework.boot.Banner;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.bannerMode(Banner.Mode.OFF)
.lazyInitialization(true)
.logStartupInfo(true)
.run(args);
}
}
lazyInitialization(true):Bean 全部懒加载,启动更快。logStartupInfo(true):打印启动信息日志。parent(...)/child(...):构建父子上下文,多模块场景用。
日常用 SpringApplication.run 就够。需要链式配置或上下文层级时,再换 Builder。
小结
banner.txt放 classpath 根目录即可替换默认 Banner。- 支持版本、颜色等占位符。
spring.main.banner-mode=off关闭 Banner。- 图片 Banner 自 3.0 M2 起已移除。
- 启动后回调三件套:CommandLineRunner、ApplicationRunner、ApplicationReadyEvent。
- 启动事件覆盖整个生命周期,按阶段监听。
- 多个回调用 @Order 排序,异常别让它中断启动。