Micronaut 可注射容器类型
除了能够注入 bean 之外,Micronaut 原生支持注入以下类型:
类型 | 描述 | 示例 |
---|---|---|
bean 的 Optional。如果 bean 不存在,则注入 empty() |
|
|
集合或集合的子类型(例如列表、集合等) |
|
|
A lazy |
|
|
给定类型的原生 bean 数组 |
|
|
一个 javax.inject.Provider 如果循环依赖需要它,或者为每个 get 调用实例化一个原型。 |
|
|
一个 jakarta.inject.Provider 如果循环依赖需要它或者为每个 get 调用实例化一个原型。 |
|
|
一个 io.micronaut.context.BeanProvider(如果循环依赖需要它或为每个 get 调用实例化一个原型)。 |
|
支持 3 种不同的提供程序类型,但是 BeanProvider 是我们建议使用的一种。
当将 java.lang.Collection 或 java.util.stream.Stream,bean 数组注入到与注入类型匹配的 bean 中时,拥有的 bean 将不是注入集合的成员。证明这一点的常见模式是聚合。例如:
@Singleton
class AggregateEngine implements Engine {
@Inject
List<Engine> engines;
@Override
public void start() {
engines.forEach(Engine::start);
}
...
}
在此示例中,注入的成员变量 engines 将不包含 AggregateEngine 的实例
一个原型 bean 将在每个注入 bean 的地方创建一个实例。当原型 bean 作为提供者注入时,每次调用 get() 都会创建一个新实例。
Collection Ordering
注入一组 bean 时,默认情况下它们是不排序的。实现 Ordered 接口以注入有序集合。如果请求的 bean 类型没有实现 Ordered,Micronaut 会在 bean 上搜索 @Order 注释。
@Order 注释对于订购由工厂创建的 bean 特别有用,其中 bean 类型是第三方库中的类。在这个例子中,LowRateLimit 和 HighRateLimit 都实现了 RateLimit 接口。
带有@Order 的工厂
Java | Groovy | Kotlin |
|
|
|
当从上下文中请求一组 RateLimit bean 时,它们将根据注释中的值按升序返回。
按顺序注入 Bean
当注入单个 bean 实例时,@Order 注释也可用于定义哪个 bean 具有最高优先级,因此应该被注入。
选择单个实例时不考虑 Ordered 接口,因为这需要实例化 bean 来解析订单。
更多建议: