国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

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 數(shù)組

Engine[]

Provider

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

Provider<Engine>

Provider

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

Provider<Engine>

BeanProvider

一個(gè) io.micronaut.context.BeanProvider(如果循環(huán)依賴需要它或?yàn)槊總€(gè) get 調(diào)用實(shí)例化一個(gè)原型)。

BeanProvider<Engine>

支持 3 種不同的提供程序類型,但是 BeanProvider 是我們建議使用的一種。

當(dāng)將 java.lang.Collection 或 java.util.stream.Stream,bean 數(shù)組注入到與注入類型匹配的 bean 中時(shí),擁有的 bean 將不是注入集合的成員。證明這一點(diǎn)的常見模式是聚合。例如:

@Singleton
class AggregateEngine implements Engine {
  @Inject
  List<Engine> engines;

  @Override
  public void start() {
    engines.forEach(Engine::start);
  }

  ...
}

在此示例中,注入的成員變量 engines 將不包含 AggregateEngine 的實(shí)例

一個(gè)原型 bean 將在每個(gè)注入 bean 的地方創(chuàng)建一個(gè)實(shí)例。當(dāng)原型 bean 作為提供者注入時(shí),每次調(diào)用 get() 都會(huì)創(chuàng)建一個(gè)新實(shí)例。

Collection Ordering

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

@Order 注釋對(duì)于訂購由工廠創(chuàng)建的 bean 特別有用,其中 bean 類型是第三方庫中的類。在這個(gè)例子中,LowRateLimit 和 HighRateLimit 都實(shí)現(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)
    }
}

當(dāng)從上下文中請(qǐng)求一組 RateLimit bean 時(shí),它們將根據(jù)注釋中的值按升序返回。

按順序注入 Bean

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

選擇單個(gè)實(shí)例時(shí)不考慮 Ordered 接口,因?yàn)檫@需要實(shí)例化 bean 來解析訂單。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)