EJB3实例化

时间:2011-04-27 22:02:50

标签: java ejb-3.0 ejb

我得到了一些非常微不足道的问题。

如果我定义了EJB3 +接口,那就说它是远程的那样:

@Remote
public class FooServiceRemote {
   void foo();
}

和一个实现

@Stateless
public class FooService implements FooServiceRemote {
   void foo() { ... }
}

如果应用服务器只知道接口注入的@EJB注释,那么默认情况下如何解析要使用的实现(并通过代理调用):

public class SomeClass {
   @EJB
   private FooServiceRemote fooService;
}

是通过反射(缩短界面名称)来完成的吗?或者他扫描这种界面的可能实现,选择一个。要么.. ?如果我想创建一个接口的更多实现,是否可能以及如何指定应该实例化的实现(也许可以通过注释的某个参数)。

感谢: - )

2 个答案:

答案 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() { ... }
}

有了这个,应用服务器就知道哪些类实现了指定的接口。

如果你有两个课程,你必须指明你需要哪个课程。