首页 / Spring Boot 入门教程 / 自定义 Banner 与启动信息

Spring Boot 入门教程

自定义 Banner 与启动信息

本教程共 48 篇 · 第 16 篇 · 更新于 2026-08-13 · 约 4 分钟阅读

Bannerbanner.txt启动信息ApplicationRunnerCommandLineRunnerApplicationReadyEvent

本节目标:换掉默认的 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 文件支持占位符,能显示版本信息:

============================
    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 packagejava -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("先执行");
    }
}
Note

Runner 在应用上下文刷新完成、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 排序,异常别让它中断启动。