我得到了一些非常微不足道的问题。
如果我定义了EJB3 +接口,那就说它是远程的那样:
@Remote
public class FooServiceRemote {
void foo();
}
和一个实现
@Stateless
public class FooService implements FooServiceRemote {
void foo() { ... }
}
如果应用服务器只知道接口注入的@EJB注释,那么默认情况下如何解析要使用的实现(并通过代理调用):
public class SomeClass {
@EJB
private FooServiceRemote fooService;
}
是通过反射(缩短界面名称)来完成的吗?或者他扫描这种界面的可能实现,选择一个。要么.. ?如果我想创建一个接口的更多实现,是否可能以及如何指定应该实例化的实现(也许可以通过注释的某个参数)。
感谢: - )
答案 0 :(得分:4)
在极少数情况下,你需要有两个bean实现相同的接口(不是一个好习惯),你可以命名它们并按名称选择你想要的那个。
@Stateless(name="FooService1")
public class FooService1 implements FooService { }
@Stateless(name="FooService2")
public class FooService2 implements FooService { }
public class SomeClass {
@EJB(beanName="FooService1")
private FooService fooService;
}
其他可能的方法是使用JNDI或mappedName
属性查找它。
请在此处查看javadoc for EJB批注:http://download.oracle.com/javaee/6/api/javax/ejb/EJB.html
答案 1 :(得分:1)
只是修复,
@Remote
interface FooServiceRemote {
void foo();
}
@Stateless
public class FooService implements FooServiceRemote {
void foo() { ... }
}
有了这个,应用服务器就知道哪些类实现了指定的接口。
如果你有两个课程,你必须指明你需要哪个课程。