8

在 CDI 中,我可以这样做:

// Qualifier annotation
@Qualifier
@inteface Specific{}

interface A {}

class DefaultImpl implements A {}

@Specific
class SpecificImpl implements A {}

然后在课堂上:

@Inject
A default;

@Inject
@Specific
A specific;

它之所以起作用,是因为@Default自动分配给注入点的限定符未指定任何限定符。

但是我正在使用 Spring 并且无法执行该操作。

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException

问题是“默认”注入(没有限定符)已经在很多我无法更改的代码中使用,我需要A为我的用户提供另一种可能的实现。

我知道我可以通过 bean 名称注入我的新实现,但我想避免它。

Spring中有什么可以帮助我实现它吗?

4

2 回答 2

16

有人指着我说@Primary 正是这样做的。我试过了,效果很好:

@Primary
class DefaultImpl implements A {}

在我的例子中 DefaultImpl 在 xml 中:

<bean id="defaultImpl" class="DefaultImpl" primary="true"/>
于 2013-10-28T19:02:56.180 回答
0

我本可以将此添加为评论,但我想添加一些带有格式的代码来解释我的观点,这就是我添加明确答案的原因。

除了您所说的之外,您实际上也可以在 Spring 中利用您的特定元注释,如下所示:

@Specific以这种方式使用 Spring 特定的org.springframework.beans.factory.annotation.Qualifier注释重新定义:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Qualifier
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Primary
public @interface Specific {
}

@Primary现在也用注释标记了特定注释。

有了这个,你的旧代码应该可以工作:

@Specific
class DefaultImpl implements A {}
于 2013-10-28T20:19:07.463 回答