我可以使用另一个注解作为 Spring @Qualifier 的值吗?
Can I use another Annotation as the value of the Spring @Qualifier?
奇怪的情况,但我正在从 dagger/dropwizard 框架迁移到 Spring。
在旧框架中,代码使用了一堆自定义的 @interface Annotations 来指定哪个 bean 去哪里。
例如,可能有这样的注解
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface ForAdmin {}
供应商有这样的代码
@Provides
@ForAdmin
static Foobar provideFoobar() { ... }
然后像这样注入
public MyObject(@ForAdmin Foobar foobar) { ... }
在 Spring 的世界里,我知道我可以将提供商翻译成
@Bean("ForAdmin")
public Foobar provideFoobar() { }
然后像这样注入
public MyObject(@Qualifier("ForAdmin") Foobar foobar) { ... }
我想知道是否有办法提供现有的 @ForAdmin
注释本身作为限定符。
类似...
@Bean(ForAdmin.class)
public Foobar provideFoobar() { }
这可能吗?有没有更好的方法?
我想这样做的原因是为了保留原始注释,以便将它们放在那里的开发人员仍然熟悉它们,并且可以通过他们已经知道使用 IDE.
您可以使用与之前完全相同的方法
假设一个接口有 2 个实现:
interface Foobar {}
class FoobarAll implements Foobar {}
class FoobarAdmin implements Foobar {}
和产生 @Bean
s
的配置
@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
}
}
P.S。为了简化您的代码,您甚至不需要 @Configuration
来生成 @Bean
,您只需在 @Component
或 @Service
Spring 上放置注释即可=30=]es。然后Spring会自动实例化这些bean。
@Component
class FoobarAll implements Foobar {}
@ForAdmin
@Component
class FoobarAdmin implements Foobar {}
奇怪的情况,但我正在从 dagger/dropwizard 框架迁移到 Spring。 在旧框架中,代码使用了一堆自定义的 @interface Annotations 来指定哪个 bean 去哪里。
例如,可能有这样的注解
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface ForAdmin {}
供应商有这样的代码
@Provides
@ForAdmin
static Foobar provideFoobar() { ... }
然后像这样注入
public MyObject(@ForAdmin Foobar foobar) { ... }
在 Spring 的世界里,我知道我可以将提供商翻译成
@Bean("ForAdmin")
public Foobar provideFoobar() { }
然后像这样注入
public MyObject(@Qualifier("ForAdmin") Foobar foobar) { ... }
我想知道是否有办法提供现有的 @ForAdmin
注释本身作为限定符。
类似...
@Bean(ForAdmin.class)
public Foobar provideFoobar() { }
这可能吗?有没有更好的方法?
我想这样做的原因是为了保留原始注释,以便将它们放在那里的开发人员仍然熟悉它们,并且可以通过他们已经知道使用 IDE.
您可以使用与之前完全相同的方法
假设一个接口有 2 个实现:
interface Foobar {}
class FoobarAll implements Foobar {}
class FoobarAdmin implements Foobar {}
和产生 @Bean
s
@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
}
}
P.S。为了简化您的代码,您甚至不需要 @Configuration
来生成 @Bean
,您只需在 @Component
或 @Service
Spring 上放置注释即可=30=]es。然后Spring会自动实例化这些bean。
@Component
class FoobarAll implements Foobar {}
@ForAdmin
@Component
class FoobarAdmin implements Foobar {}