Micronaut 环境

2023-02-28 17:55 更新

应用程序环境由 Environment 接口建模,它允许在创建 ApplicationContext 时指定一个或多个唯一的环境名称。

初始化环境

 Java Groovy  Kotlin 
ApplicationContext applicationContext = ApplicationContext.run("test", "android");
Environment environment = applicationContext.getEnvironment();

assertTrue(environment.getActiveNames().contains("test"));
assertTrue(environment.getActiveNames().contains("android"));
when:
ApplicationContext applicationContext = ApplicationContext.run("test", "android")
Environment environment = applicationContext.getEnvironment()

then:
environment.activeNames.contains("test")
environment.activeNames.contains("android")
val applicationContext = ApplicationContext.run("test", "android")
val environment = applicationContext.environment

assertTrue(environment.activeNames.contains("test"))
assertTrue(environment.activeNames.contains("android"))

活动环境名称允许根据环境加载不同的配置文件,还可以使用 @Requires 注释有条件地加载 bean 或 bean @Configuration 包。

此外,Micronaut 会尝试检测当前环境。例如,在 Spock 或 JUnit 测试中,TEST 环境会自动激活。

可以使用 micronaut.environments 系统属性或 MICRONAUT_ENVIRONMENTS 环境变量指定其他活动环境。这些被指定为逗号分隔的列表。例如:

指定环境

$ java -Dmicronaut.environments=foo,bar -jar myapp.jar

以上激活了名为 foo 和 bar 的环境。

最后,还检测到云环境名称。

环境优先

Micronaut 根据指定的环境加载属性源,如果相同的属性键存在于特定于环境的多个属性源中,则环境顺序决定使用哪个值。

Micronaut 使用以下层次结构进行环境处理(优先级从低到高):

  • 推导环境

  • 来自 micronaut.environments 系统属性的环境

  • 来自 MICRONAUT_ENVIRONMENTS 环境变量的环境

  • 通过应用程序上下文构建器明确指定的环境

这也适用于 @MicronautTest(environments = … )

禁用环境检测

可以通过将 micronaut.env.deduction 系统属性或 MICRONAUT_ENV_DEDUCTION 环境变量设置为 false 来禁用环境的自动检测。这可以防止 Micronaut 检测当前环境,同时仍然使用如上所示专门提供的任何环境。

通过系统属性禁用环境检测

$  java -Dmicronaut.env.deduction=false -jar myapp.jar

或者,您可以在设置应用程序时使用 ApplicationContextBuilder deduceEnvironment 方法禁用环境推导。

使用 ApplicationContextBuilder 禁用环境推导

 Java Groovy  Kotlin 
@Test
public void testDisableEnvironmentDeductionViaBuilder() {
    ApplicationContext ctx = ApplicationContext.builder()
            .deduceEnvironment(false)
            .properties(Collections.singletonMap("micronaut.server.port", -1))
            .start();
    assertFalse(ctx.getEnvironment().getActiveNames().contains(Environment.TEST));
    ctx.close();
}
void "test disable environment deduction via builder"() {
    when:
    ApplicationContext ctx = ApplicationContext.builder().deduceEnvironment(false).start()

    then:
    !ctx.environment.activeNames.contains(Environment.TEST)

    cleanup:
    ctx.close()
}
"test disable environment deduction via builder"() {
    val ctx = ApplicationContext.builder().deduceEnvironment(false).start()
    assertFalse(ctx.environment.activeNames.contains(Environment.TEST))
    ctx.close()
}

默认环境

Micronaut 支持一个或多个默认环境的概念。默认环境是仅在没有明确指定或推导其他环境时才应用的环境。可以通过应用程序上下文构建器 Micronaut.build().environments(… )、micronaut.environments 系统属性或 MICRONAUT_ENVIRONMENTS 环境变量显式指定环境。可以推断环境以自动应用适合云部署的环境。如果通过上述任何一种方式找到环境,则不会应用默认环境。

要设置默认环境,请包含一个实现 ApplicationContextConfigurer 并使用 ContextConfigurer 注释的公共静态类:

public class Application {

    @ContextConfigurer
    public static class DefaultEnvironmentConfigurer implements ApplicationContextConfigurer {
        @Override
        public void configure(@NonNull ApplicationContextBuilder builder) {
            builder.defaultEnvironments(defaultEnvironment);
        }
    }

    public static void main(String[] args) {
        Micronaut.run(Application.class, args);
    }
}

以前,我们建议使用 Micronaut.defaultEnvironments("dev"),但这不允许提前 (AOT) 编译器检测默认环境。

Micronaut Banner

从 Micronaut 2.3 开始,应用程序启动时会显示一个横幅。它默认启用,它还显示 Micronaut 版本。

$ ./gradlew run
 __  __ _                                  _
|  \/  (_) ___ _ __ ___  _ __   __ _ _   _| |_
| |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
| |  | | | (__| | | (_) | | | | (_| | |_| | |_
|_|  |_|_|\___|_|  \___/|_| |_|\__,_|\__,_|\__|
  Micronaut (3.8.6)

17:07:22.997 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 611ms. Server Running: http://localhost:8080

要使用您自己的 ASCII 艺术(此时只是普通的 ASCII)自定义横幅,请创建文件 src/main/resources/micronaut-banner.txt,它将被使用。

要禁用它,请修改您的应用程序类:

public class Application {

    public static void main(String[] args) {
        Micronaut.build(args)
                 .banner(false) (1)
                 .start();
    }
}
  1. 禁用 banner


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号