看了很多 获取 变量的例子: 大多是用
@value("${spring.profiles.acitve"}
赋值给对象的属性
不满意止步于此,而且对我来说,根本不能用
@value("${spring.profiles.acitve"}
springcontext
完全加载后,才能使用该对象。原因是 作为对象的属性,必须被容器管理后,才能被调用。当 spring 容器 没有完全启动时,也无法加载该参数。spring
加载 Enviroment
环境参数完成的事件 ApplicationEnvironmentPreparedEvent
。profile
等信息,而且加载时机非常早,在一系列 SpringApplicationEvent
中 仅次于 ApplicationStartingEvent
,见下图。 而 ApplicationStartingEvent
因为太过早期,所以不建议使用。org.springframework.core.env.ConfigurableEnvironment
.bootstrap.yml
中配置,优先于application.yml
Environment
,进而获取spring 帮我们整理好的全部参数自定义监听器的代码如下 SpringApplicationEventListener
:
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.boot.context.event.SpringApplicationEvent;
import org.springframework.context.ApplicationListener;
/**
* 监听 ApplicationEnvironmentPreparedEvent 事件,第一时间 获取 profile 信息, 设置为 static 变量备用 ,一并设置 isProd,isDev,isTest 备用
*
* 代码参考 https://stackoverflow.com/questions/48837173/unable-to-intercept-applicationenvironmentpreparedevent-in-spring-boot
*
* @see SpringApplication#prepareEnvironment(org.springframework.boot.SpringApplicationRunListeners, org.springframework.boot.ApplicationArguments)
*
* @author stormfeng
* @date 2022-08-23 16:44
*/
@Slf4j
public class SpringApplicationEventListener implements ApplicationListener<SpringApplicationEvent> {
// 这几个 静态变量,可以很方便的在其他类中作为工具使用
public static String profile;
public static boolean isProd,isDev,isTest;
/**
* 监听 SpringApplicationEvent
*/
@Override
public void onApplicationEvent(SpringApplicationEvent event) {
log.debug("监听到 SpringApplicationEvent :{}", event.getClass().getSimpleName());
if (event instanceof ApplicationEnvironmentPreparedEvent) {
final ApplicationEnvironmentPreparedEvent e = (ApplicationEnvironmentPreparedEvent) event;
final String[] activeProfiles = e.getEnvironment().getActiveProfiles();
profile = activeProfiles[0].
initProfile();
log.info("监听到 SpringApplicationEvent :{},设置profile :{}", event.getClass().getSimpleName(), profile);
}
}
private void initProfile() {
isProd = "prod".equalsIgnoreCase(profile);
isTest = "test".equalsIgnoreCase(profile);
isDev = "dev".equalsIgnoreCase(profile);
}
此时因springContext尚未完全加载,因此不能使用 @EventListener
自动注入监听器 ,必须手动添加 listeners()
@SpringBootApplication
public class BootApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(BootApplication.class).listeners(new SpringApplicationEventListener()).build().run(args);
log.info("----------------------Application start complete--------------------------");
}
}