背景
博主在主程序中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) {
}
}
}
这样便可以在测试用例执行时在ApplicationEnvironmentPreparedEvent事件发生时做一些自定义初始化内容
尊重作者,转载请注明出处!
版权申明:本文版权归作者所有,未经授权,任何单位或个人不得以任何形式转载、摘编或利用其它方式使用本博客内容。作者保留追究相关法律责任的权利。如需使用博客内容,请与作者联系获得授权。感谢对本文的尊重与支持。
免责声明:本网站所载内容仅供参考,不构成任何专业建议。用户基于本网站内容作出的决策,风险自担。对于因使用本网站内容而产生的任何直接或间接损失,本网站不承担任何责任。请用户审慎判断,理性使用。