Micronaut 可注射容器類型

2023-02-27 14:53 更新

除了能夠注入 bean 之外,Micronaut 原生支持注入以下類型:

表 1. 可注射容器類型
類型 描述 示例

java.util.Optional

bean 的 Optional。如果 bean 不存在,則注入 empty()

Optional<Engine>

java.lang.Collection

集合或集合的子類型(例如列表、集合等)

Collection<Engine>

java.util.stream.Stream

A lazy Stream of beans

Stream<Engine>

Array

給定類型的原生 bean 數組

Engine[]

Provider

一個 javax.inject.Provider 如果循環(huán)依賴需要它,或者為每個 get 調用實例化一個原型。

Provider<Engine>

Provider

一個 jakarta.inject.Provider 如果循環(huán)依賴需要它或者為每個 get 調用實例化一個原型。

Provider<Engine>

BeanProvider

一個 io.micronaut.context.BeanProvider(如果循環(huán)依賴需要它或為每個 get 調用實例化一個原型)。

BeanProvider<Engine>

支持 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 的地方創(chuàng)建一個實例。當原型 bean 作為提供者注入時,每次調用 get() 都會創(chuàng)建一個新實例。

Collection Ordering

注入一組 bean 時,默認情況下它們是不排序的。實現(xiàn) Ordered 接口以注入有序集合。如果請求的 bean 類型沒有實現(xiàn) Ordered,Micronaut 會在 bean 上搜索 @Order 注釋。

@Order 注釋對于訂購由工廠創(chuàng)建的 bean 特別有用,其中 bean 類型是第三方庫中的類。在這個例子中,LowRateLimit 和 HighRateLimit 都實現(xiàn)了 RateLimit 接口。

帶有@Order 的工廠

 Java Groovy  Kotlin 
import io.micronaut.context.annotation.Factory;
import io.micronaut.core.annotation.Order;

import jakarta.inject.Singleton;
import java.time.Duration;

@Factory
public class RateLimitsFactory {

    @Singleton
    @Order(20)
    LowRateLimit rateLimit2() {
        return new LowRateLimit(Duration.ofMinutes(50), 100);
    }

    @Singleton
    @Order(10)
    HighRateLimit rateLimit1() {
        return new HighRateLimit(Duration.ofMinutes(50), 1000);
    }
}
import io.micronaut.context.annotation.Factory
import io.micronaut.core.annotation.Order

import jakarta.inject.Singleton
import java.time.Duration

@Factory
class RateLimitsFactory {

    @Singleton
    @Order(20)
    LowRateLimit rateLimit2() {
        new LowRateLimit(Duration.ofMinutes(50), 100);
    }

    @Singleton
    @Order(10)
    HighRateLimit rateLimit1() {
        new HighRateLimit(Duration.ofMinutes(50), 1000);
    }
}
import io.micronaut.context.annotation.Factory
import io.micronaut.core.annotation.Order
import java.time.Duration
import jakarta.inject.Singleton

@Factory
class RateLimitsFactory {

    @Singleton
    @Order(20)
    fun rateLimit2(): LowRateLimit {
        return LowRateLimit(Duration.ofMinutes(50), 100)
    }

    @Singleton
    @Order(10)
    fun rateLimit1(): HighRateLimit {
        return HighRateLimit(Duration.ofMinutes(50), 1000)
    }
}

當從上下文中請求一組 RateLimit bean 時,它們將根據注釋中的值按升序返回。

按順序注入 Bean

當注入單個 bean 實例時,@Order 注釋也可用于定義哪個 bean 具有最高優(yōu)先級,因此應該被注入。

選擇單個實例時不考慮 Ordered 接口,因為這需要實例化 bean 來解析訂單。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號