Micronaut 条件 Beans
有时您可能希望根据各种潜在因素(包括类路径、配置、其他 bean 的存在等)有条件地加载 bean。
Requires 注释提供了在 bean 上定义一个或多个条件的能力。
考虑以下示例:
Using @Requires
Java | Groovy | Kotlin |
|
|
|
上面的 bean 定义了两个要求。第一个指示必须存在 DataSource bean 才能加载 bean。第二个要求确保在加载 JdbcBookService bean 之前设置 datasource.url 属性。
Kotlin 目前不支持可重复注解。当需要多个需求时使用@Requirements 注释。例如,@Requirements(Requires(… ), Requires(… ))。请参阅 https://youtrack.jetbrains.com/issue/KT-12794 以跟踪此功能。
如果多个 bean 需要相同的需求组合,您可以定义一个带有需求的元注释:
使用@Requires 元注解
Java | Groovy | Kotlin |
|
|
|
在上面的示例中,可以在 JdbcBookService 上使用 RequiresJdbc 注释:
使用元注解
@RequiresJdbc
public class JdbcBookService implements BookService {
...
}
如果您有多个 bean 需要在加载前满足给定要求,您可能需要考虑一个 bean 配置组,如下一节所述。
配置要求
@Requires 注解非常灵活,可用于多种用例。下表总结了一些可能性:
需求 | 示例 |
---|---|
要求存在一个或多个类 |
|
要求缺少一个或多个类 |
|
要求存在一个或多个 beans |
|
要求不存在一个或多个 bean |
|
要求应用环境 |
|
要求环境不适用 |
|
需要存在另一个配置包 |
|
要求不存在另一个配置包 |
|
需要特定的 SDK 版本 |
|
要求使用给定注释注释的类通过包扫描可供应用程序使用 |
|
需要具有可选值的属性 |
|
要求属性不属于配置的一部分 |
|
要求文件系统中存在一个或多个文件 |
|
要求存在一个或多个类路径资源 |
|
要求当前操作系统在列表中 |
|
要求当前操作系统不在列表中 |
|
如果未指定 beanProperty,则需要存在 bean |
|
需要存在指定的 bean 属性 |
|
关于属性要求的附加说明。
添加对属性的要求具有一些附加功能。您可以要求属性为特定值,而不是特定值,如果未设置,则在这些检查中使用默认值。
@Requires(property="foo") (1)
@Requires(property="foo", value="John") (2)
@Requires(property="foo", value="John", defaultValue="John") (3)
@Requires(property="foo", notEquals="Sally") (4)
需要设置属性
要求属性为“John”
要求属性为“John”或未设置
要求属性不是“Sally”或未设置
在 @Requires 中引用 bean 属性。
您还可以在 @Requires 中引用其他 bean 属性以有条件地加载 bean。与属性要求类似,您可以指定所需的值或设置值 bean 属性不应等于使用 notEquals 注释成员。对于要检查的 bean 属性,bean 注释成员中指定类型的 bean 应该存在于上下文中,否则将不会加载条件 bean。
@Requires(bean=Config.class, beanProperty="foo") (1)
@Requires(bean=Config.class, beanProperty="foo", value="John") (2)
@Requires(bean=Config.class, beanProperty="foo", notEquals="Sally") (3)
需要设置 Config bean 的“foo”属性
要求 Config bean 上的“foo”属性为“John”
要求 Config bean 上的“foo”属性不是“Sally”或未设置
通过相应的 getter 方法访问指定的 bean 属性,这些方法的存在和可用性将在编译时检查。
请注意,如果 bean 属性的值不为空,则认为它存在。请记住,原始属性使用默认值初始化,例如布尔值的 false 和 int 的 0,因此即使没有为它们明确指定值,它们也被视为已设置。
调试条件 Bean
如果您有多个条件和复杂的要求,可能很难理解为什么没有加载特定的 bean。
为了帮助解决条件 bean 的问题,您可以为 io.micronaut.context.condition 包启用调试日志记录,它将记录 bean 未加载的原因。
logback.xml
<logger name="io.micronaut.context.condition" level="DEBUG"/>
更多建议: