这里,一个类是另一个类的子类。因此,@Typed注释用于防止@Inject模糊。
@Dependent
public class UserScope extends Scope {}
@Dependent
@Typed(UserScopeAllowIdEquals.class) // Restrict bean type.
public class UserScopeAllowIdEquals extends UserScope {}
以下用法会导致Intellij中的检查警告:
public class A {
@Inject UserScope userScope;
}
不明确的依赖:有多个bean匹配 注射点
但是,应用程序编译并运行,容器不将其视为定义错误。它的编写方式有问题吗?我怀疑,如果this answer to a different question是正确的,则表示只有一个bean的bean类型包含超类。
注意:正如预期的那样,以下用法不会导致Intellij检查警告。
public class B {
@Inject UserScopeAllowIdEquals usaie;
}
答案 0 :(得分:1)
基于CDI,只要有一个bean的多个实现,那么@Default
限定符就不再适用。
要解决这个问题,您需要明确告诉CDI您的定义中的哪个bean是默认bean。
@Dependent
@Default
public class UserScope extends Scope {}
@Dependent
@Typed(UserScopeAllowIdEquals.class) // Restrict bean type.
public class UserScopeAllowIdEquals extends UserScope {}
因此,当您注入Scope
bean而没有任何限定符时,将选择已明确指定为默认值的bean:
@Inject
private Scope scopeBean; // The @Default annotated, if any of a Scope implementation is used.