【问题标题】:How to make Spring @autowired annotation to pick a certain type without using @Qualifier?如何在不使用 @Qualifier 的情况下使 Spring @autowired 注释选择某种类型?
【发布时间】:2012-03-11 09:16:47
【问题描述】:
有没有办法为 Spring @autowired 注解指定默认类型?例如,我有扩展 ValidatorA 的 bean ValidatorA 和 bean ValidatorB。
ValidatorA 用于其他一些地方,并使用@autowired 注入。
有没有办法强制 Spring 在不更改现有代码的情况下注入 ValidatorB 而不是 ValidatorA?
我在How to override the behavior of Spring @Autowired 找到的唯一解决方案建议将 ValidatorA 从上下文中排除。
还有其他方法吗?
例如,使用 Guice,我只需将 ValidatorA.class 绑定到 ValidatorB.class,这正是我需要的。
将@Qualifier 添加到 ValidatorB 没有问题,但 ValidatorA 应该保持不变。
Guice 提供了定义“Providers”的能力,Spring 中有类似的东西吗?也许带有@Configuration 注释?
【问题讨论】:
标签:
spring
dependency-injection
【解决方案1】:
我认为你可以在那里使用primary 指示器。如果您的 bean 是通过注解定义的,请将 @Primary 添加到 ValidatorB 定义中。如果您使用的是 xml 配置,请将 primary="true" 添加到 <bean> 定义中。
【解决方案2】:
有没有办法在不改变现有代码的情况下强制 Spring 注入 ValidatorB 而不是 ValidatorA?
不改代码,我很怀疑。您可以更改应用程序上下文或更改代码,如下所示:
@Component
@Qualifier("B")
public class ValidatorB extends ValidatorA {
}
然后像这样注入(还有other syntactic options)
@Resource
@Qualifier("B")
private ValidatorA validatorB;