如何在Spring Boot应用启动前实现打印Hello World的需求
问题原因说明
你当前使用的CommandLineRunner是Spring Boot专门设计为在ApplicationContext完全初始化、整个启动流程全部走完之后才触发的回调接口,所以打印内容自然会出现在所有启动日志的末尾,不符合你的需求。
可行实现方案
方案1:直接在main方法的SpringApplication.run执行前添加逻辑(最简单、优先级最高)
这是最直接的实现方式,代码会在Spring Boot启动流程正式开始前执行,示例代码如下:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SampleApplication { public static void main(String[] args) { // 此处代码会在Spring Boot启动前执行 System.out.print("I would be appear in log first before spring application starts"); SpringApplication.run(SampleApplication.class, args); } }
方案2:使用ApplicationContextInitializer(容器刷新前执行,可操作上下文对象)
如果你的逻辑需要用到Spring上下文相关的能力,可以使用这个接口,它会在ApplicationContext执行refresh操作之前触发:
- 自定义初始化器实现类:
import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.print("ApplicationContext刷新前执行的打印逻辑"); } }
- 注册初始化器,修改main方法即可:
public static void main(String[] args) { SpringApplication app = new SpringApplication(SampleApplication.class); app.addInitializers(new MyApplicationContextInitializer()); app.run(args); }
方案3:使用EnvironmentPostProcessor(环境配置准备完成后、上下文创建前执行)
如果你的逻辑需要提前读取Spring的环境配置(比如application.yml里的参数),可以使用这个接口,执行时机比ApplicationContextInitializer更早:
- 自定义实现类:
import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.env.ConfigurableEnvironment; public class MyEnvPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { System.out.print("环境配置准备完成后执行的打印逻辑,此时可直接读取配置参数"); } }
- 注册配置:在resources目录下新建
META-INF/spring.factories文件,添加如下内容:
org.springframework.boot.env.EnvironmentPostProcessor=你的类所在包路径.MyEnvPostProcessor
各方案执行顺序
从先到后依次为:
- main方法中
SpringApplication.run之前的代码 EnvironmentPostProcessor实现类的逻辑ApplicationContextInitializer实现类的逻辑CommandLineRunner/ApplicationRunner实现类的逻辑(即你原有写法的执行时机)
内容的提问来源于stack exchange,提问作者Bryan Caliwag
相关产品推荐
相关产品推荐

