Springboot框架运行Test用例时自定义ApplicationListener(上下文创建的早期)可做一些动态配置

2026-03-01 / 1 阅读 / Java
背景
博主在主程序中Application启动时增加了监听器,用于创建动态路径(比如文件存放位置),如:
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(getListener());
application.run(args);

这边在正常启动时是可以监听到ApplicationEnvironmentPreparedEvent事件,因为要做一些配置必须早于这个事件,否则不会生效。但是在跑测试用例@SpringTest时,遇到问题了;原因时Test用例的上下文是自动创建的,哪怕@Bean注册自定义监听器,也是无法监听到ApplicationEnvironmentPreparedEvent这类靠前的事件

解决方案

要解决加载时机问题,使用配置文件spring.factories,其是实现了Spring的自动配置SPI 机制的方式

什么是 spring.factories?
spring.factories 是一个纯文本的键值对配置文件,遵循 Java SPI(Service Provider Interface)的设计思想,核心作用是让 Spring 框架能够自动发现并加载指定的类,无需手动配置。

它的默认存放路径是:META-INF/spring.factories

因此在test/resources创建文件spring.factories,并填入以下配置:

org.springframework.context.ApplicationListener=\
xxx.ExampleApplicationListener

监听器ExampleApplicationListener.java如下:

public ExampleApplicationListenerimplements ApplicationListener<ApplicationEvent> {

    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
       if (applicationEvent instanceof ApplicationEnvironmentPreparedEvent) {
	     // todo 逻辑
	     }
    }
}


这样便可以在测试用例执行时在ApplicationEnvironmentPreparedEvent事件发生时做一些自定义初始化内容

相关推荐