我有以下课程:
public class Service
{
@Autowired
@Qualifier(Helper.BEAN_NAME)
protected Helper helper;
...
}
@Component(Helper.BEAN_NAME)
public class Helper
{
public static final String BEAN_NAME = "Helper";
...
}
@Component(Helper.BEAN_NAME)
public class ExtHelper extends Helper
{
...
}
我的目标是不涉及服务或帮助程序类。我的想法是,通过为ExtHelper提供与Helper相同的bean名称,Spring会将ExtHelper实现自动连接到Service而不是Helper。
我看到的结果参差不齐。如果我的pom AFTER Helper中包含ExtHelper,它可以正常工作。但是之前,我收到了ConflictingBeanDefinitionException。我理解该异常,但不理解为什么如果我在POM中交换依赖关系的顺序会得到它。
我的基本问题是,我在概念上是否正确地做到了这一点。 @Qualifier是否旨在防止这种自动装配替代?如果没有,那么使Spring通过选择对基类的扩展来解决冲突的规则是什么?我是否需要扩展Service类以获得我想要的东西?我是Spring的新手,却不太了解该怎么做。
答案 0 :(得分:0)
@Qualifier
用于指示Spring在有多个可用类型的bean的情况下应该注入哪个bean。
在您的情况下,您可以将两个bean注入到protected Helper helper
属性中,因此您必须告诉Spring应该使用哪个bean。您无法使用@Qualifier
来完成此操作,因为两个bean的名称相同。
如果您不想触碰这些类,则可以使用另一个注释来优先处理Bean-@Primary
。将其添加到ExtHelper
上,如果有多个可注入的bean,它将被视为首选bean。
如果您想呆在@Qualifier
上,则需要更改其中一个bean的名称并注入首选bean:
@Component
public class Service
{
@Autowired
@Qualifier("extHelper")
protected Helper helper; // instance of Helper or ExtHelper could be injected here
...
}
@Component // bean will be named using default naming strategy: helper. You can obviously use your own name
public class Helper
{
...
}
@Component // bean will be named using default naming strategy: extHelper. You can obviously use your own name
public class ExtHelper extends Helper
{
...
}