Micronaut 使用@EachBean 驅(qū)動配置

2023-03-01 16:20 更新

@EachProperty 注釋是驅(qū)動動態(tài)配置的好方法,但通常您希望將該配置注入到依賴它的另一個 bean 中。使用硬編碼限定符注入單個實例不是一個很好的解決方案,因此 @EachProperty 通常與 @EachBean 結(jié)合使用:

使用@EachBean

 Java Groovy  Kotlin 
@Factory // (1)
public class DataSourceFactory {

    @EachBean(DataSourceConfiguration.class) // (2)
    DataSource dataSource(DataSourceConfiguration configuration) { // (3)
        URI url = configuration.getUrl();
        return new DataSource(url);
    }
@Factory // (1)
class DataSourceFactory {

    @EachBean(DataSourceConfiguration) // (2)
    DataSource dataSource(DataSourceConfiguration configuration) { // (3)
        URI url = configuration.url
        return new DataSource(url)
    }
@Factory // (1)
class DataSourceFactory {

    @EachBean(DataSourceConfiguration::class) // (2)
    internal fun dataSource(configuration: DataSourceConfiguration): DataSource { // (3)
        val url = configuration.url
        return DataSource(url)
    }
  1. 上面的示例定義了一個創(chuàng)建 javax.sql.DataSource 實例的 bean Factory。

  2. @EachBean 注釋表示將為上一節(jié)中定義的每個 DataSourceConfiguration 創(chuàng)建一個新的 DataSource bean。

  3. DataSourceConfiguration 實例作為方法參數(shù)注入并用于驅(qū)動每個 javax.sql.DataSource 的配置

請注意,@EachBean 要求父 bean 具有 @Named 限定符,因為該限定符由 @EachBean 創(chuàng)建的每個 bean 繼承。

換句話說,要檢索由 test.datasource.one 創(chuàng)建的數(shù)據(jù)源,您可以執(zhí)行以下操作:

使用限定符

 Java Groovy  Kotlin 
Collection<DataSource> beansOfType = applicationContext.getBeansOfType(DataSource.class);
assertEquals(2, beansOfType.size()); // (1)

DataSource firstConfig = applicationContext.getBean(
        DataSource.class,
        Qualifiers.byName("one") // (2)
);
when:
Collection<DataSource> beansOfType = applicationContext.getBeansOfType(DataSource)
assertEquals(2, beansOfType.size()) // (1)

DataSource firstConfig = applicationContext.getBean(
        DataSource,
        Qualifiers.byName("one") // (2)
)
val beansOfType = applicationContext.getBeansOfType(DataSource::class.java)
assertEquals(2, beansOfType.size) // (1)

val firstConfig = applicationContext.getBean(
        DataSource::class.java,
        Qualifiers.byName("one") // (2)
)
  1. 我們在這里證明確實有兩個數(shù)據(jù)源。我們怎樣才能得到一個特別的?

  2. 通過使用 Qualifiers.byName("one"),我們可以選擇我們想要引用的兩個 bean 中的哪一個。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號