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