在Spring中是否有相当于CDI的@Default限定符?

时间:2013-10-28 18:52:57

标签: java spring dependency-injection

在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中有什么可以帮助我实现它吗?

2 个答案:

答案 0 :(得分:14)

有人指着我说@Primary正是这样做的。我试过,它完美无缺:

@Primary
class DefaultImpl implements A {}

在我的情况下,DefaultImpl在xml:

<bean id="defaultImpl" class="DefaultImpl" primary="true"/>

答案 1 :(得分:0)

我本可以添加这个作为注释,但我想添加一些带格式的代码来解释我的观点,这就是为什么我要添加一个明确的答案。

根据您所说的内容,您实际上可以在Spring中利用您的特定元注释,其中包括以下几行:

以这种方式使用Spring特定@Specific注释重新定义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 {}