![](/img/trans.png)
[英]Can I use a Spring @Value variable from properties in another annotation?
[英]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.