簡體   English   中英

我可以使用另一個 Annotation 作為 Spring @Qualifier 的值嗎?

[英]Can I use another Annotation as the value of the Spring @Qualifier?

奇怪的情況,但我正在從 dagger/dropwizard 框架遷移到 Spring。在舊框架中,代碼使用一堆自定義 @interface 注釋來指定哪個 bean 去哪里。

例如,可能有這樣的注釋

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface ForAdmin {}

供應商有這樣的代碼

@Provides
@ForAdmin
static Foobar provideFoobar() { ... }

像這樣注入

public MyObject(@ForAdmin Foobar foobar) { ... }

在 Spring 的世界里,我知道我可以將 provider 翻譯成

@Bean("ForAdmin")
public Foobar provideFoobar() { }

像這樣注入

public MyObject(@Qualifier("ForAdmin") Foobar foobar) { ... }

我想知道是否有辦法提供現有的@ForAdmin注釋本身作為限定符。

就像是...

@Bean(ForAdmin.class)
public Foobar provideFoobar() { }

這可能嗎? 有沒有更好的辦法?

我想這樣做的原因是為了保留原始注釋,以便將它們放在那里的開發人員仍然熟悉它們,並且可以通過他們已經知道的關於使用 IDE 的注釋來跟蹤 bean 和注入。

您可以使用與之前完全相同的方法

假設一個接口有 2 個實現:

interface Foobar {}

class FoobarAll implements Foobar {}

class FoobarAdmin implements Foobar {}

和產生@Bean的配置

@Configuration
class FoobarConfig {
    @Bean
    Foobar provideFoobarAll() { return new FoobarAll(); }

    @ForAdmin
    @Bean
    Foobar provideFoobarAdmin() { return new FoobarAdmin(); }
}

並注入一個 class Foobar

@Component
class FoobarConsumer {
    private final Foobar foobar;

    public FoobarConsumer(@ForAdmin Foobar foobar) {
        this.foobar = foobar;
        System.out.println("I am " + this.foobar.getClass().getSimpleName()); 
        // >>> I am FoobarAdmin
    }
}

PS 為了簡化您的代碼,您甚至不需要@Configuration來生成@Bean s,您可以簡單地在您的類上放置@Component@Service Spring 注釋。 然后Spring會自動實例化這些bean。

@Component
class FoobarAll implements Foobar {}

@ForAdmin
@Component
class FoobarAdmin implements Foobar {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM