我有一个方法I
的接口m
和两个具体的实现A
和B
。
public interface I{
public void m();
}
public class A implements I{
public void m(){
//
}
}
public class B implements I{
public void m(){
//
}
}
我想知道何时注入I
将执行两种方法中的哪一种
@EJB
private I service;
///
service.m();
/////
答案 0 :(得分:2)
它们都不会,因为应用程序服务器不知道要使用哪个实现,所以它会变成错误。为了避免这种情况,只需提供类实现的id,默认情况下该类的名称与类相同,但以小写字母开头:
//uncomment one of these
//@EJB(name="a")
//@EJB(name="b")
private I service;
答案 1 :(得分:0)
他们都不是。代码将编译,但您无法在应用程序服务器上部署它。如果没有指定注入类的类型,您将得到类似于此的异常:
org.jboss.weld.exceptions.DeploymentException:WELD-001409 Ambiguous dependencies
for type [...] with qualifiers [...] at injection point [...]. Possible dependencies
[...] with qualifiers [...], Managed Bean [...] with qualifiers [...]
容器(即您的应用程序服务器)无法识别您确实要注入哪个字段(A或B)。它不能凭空想出来。要避免这种错误,请为其提供注释(称为限定符),指定是否要注入A类或B类。如果您想要一个示例,您应该看到this article。