如何在运行时程序化设置Micronaut应用名称?
如何程序化设置Micronaut应用名称
需求是根据是否存在激活的配置文件(Profiles),动态设置micronaut.application.name属性:
- 若有激活的Profiles,将属性值设为
app-with-profiles - 若无激活的Profiles,将属性值设为
app-without-profiles
尝试了以下代码但未达到预期效果:
@Singleton public class AppNameInitializer { @Inject public void initAppName(Environment env) { String propertyLowercase = "micronaut.application.name"; String propertyUppercase = "MICRONAUT_APPLICATION_NAME"; String appNameWithProfiles = "app-with-profiles"; String appNameWithoutProfiles = "app-without-profiles"; if (CollectionUtils.isNotEmpty(env.getActiveNames()) ){ System.setProperty(propertyLowercase, appNameWithProfiles); System.setProperty(propertyUppercase, appNameWithProfiles); } else { System.setProperty(propertyLowercase, appNameWithoutProfiles); System.setProperty(propertyUppercase, appNameWithoutProfiles); } } }
问题原因
直接调用System.setProperty()无法生效,因为Micronaut的Environment在应用启动初期就完成了配置的加载与解析,后续修改系统属性不会同步到已初始化的Environment实例中。
正确实现方式
方式1:向Environment添加自定义属性源
通过添加优先级更高的自定义属性源,覆盖默认的应用名称配置:
import io.micronaut.context.annotation.Singleton; import io.micronaut.core.env.Environment; import io.micronaut.core.env.MapPropertySource; import org.springframework.util.CollectionUtils; import jakarta.inject.Inject; import java.util.HashMap; import java.util.Map; @Singleton public class AppNameInitializer { @Inject public void initAppName(Environment env) { String appName = CollectionUtils.isNotEmpty(env.getActiveNames()) ? "app-with-profiles" : "app-without-profiles"; // 构建自定义属性源,命名为dynamic-app-name Map<String, Object> properties = new HashMap<>(); properties.put("micronaut.application.name", appName); MapPropertySource propertySource = new MapPropertySource("dynamic-app-name", properties); // 将属性源插入到最前面,确保优先级高于其他配置源 env.addPropertySource(0, propertySource); } }
方式2:启动前通过ApplicationContextBuilder设置
如果不需要运行时动态修改,可在应用启动阶段直接通过上下文构建器设置属性:
import io.micronaut.context.ApplicationContext; import io.micronaut.core.env.Environment; import org.springframework.util.CollectionUtils; public class Application { public static void main(String[] args) { // 先解析环境以获取激活的Profiles Environment preEnv = ApplicationContext.builder() .deduceEnvironment(true) .build() .getEnvironment(); String appName = CollectionUtils.isNotEmpty(preEnv.getActiveNames()) ? "app-with-profiles" : "app-without-profiles"; // 启动应用并设置动态生成的应用名称 ApplicationContext context = ApplicationContext.builder() .property("micronaut.application.name", appName) .start(); } }
方式3:监听启动事件确保属性生效
通过监听StartupEvent,在应用启动完成前完成属性设置:
import io.micronaut.context.event.StartupEvent; import io.micronaut.runtime.event.annotation.EventListener; import io.micronaut.core.env.Environment; import io.micronaut.core.env.MapPropertySource; import org.springframework.util.CollectionUtils; import jakarta.inject.Singleton; import java.util.HashMap; import java.util.Map; @Singleton public class AppNameInitializer { private final Environment environment; public AppNameInitializer(Environment environment) { this.environment = environment; } @EventListener public void onStartup(StartupEvent event) { String appName = CollectionUtils.isNotEmpty(environment.getActiveNames()) ? "app-with-profiles" : "app-without-profiles"; Map<String, Object> properties = new HashMap<>(); properties.put("micronaut.application.name", appName); MapPropertySource propertySource = new MapPropertySource("dynamic-app-name", properties); environment.addPropertySource(0, propertySource); } }
内容的提问来源于stack exchange,提问作者LShubinaDev
相关产品推荐
相关产品推荐

