我有一个包含WAR的EAR文件。
EAR包含一个EJB jar。 EJB公开了本地和远程接口。
@Stateless(name = "FooServiceEJB")
@Local(IFooServiceLocal.class)
@Remote(IFooService.class)
public class FooServiceBean implements IFooService, IFooServiceLocal {
...
}
WAR文件定义了一个带JAXRS注释的类。
@Path("/foo")
@LocalBean
@Stateless
public class FooResource {
...
}
我希望将EJB的本地“视图”注入JAXRS资源类。显然我有两个选项,我认为这两个选项是相同的(大部分):
我正在运行JBoss EAP 6.2.0.GA(AS 7.3.0.Final-redhat-14)。
我看到的行为差异如下(在JBoss上 - 没有尝试过任何其他应用服务器):
如果我使用 @EJB 注入本地ejb,那么调用语义是引用(如预期的那样)。例如:
@EJB
private FooServiceLocal fooService;
但是,如果我使用 @Inject 注入本地ejb,则调用语义按值(即发生序列化)。例如:
@Inject
private IFooServiceLocal fooService;
这是我认为正在执行序列化的类的线程堆栈的快照。当我使用@EJB annoation时,线程堆栈完全不同。
http://i.stack.imgur.com/BXSaz.png
为什么我看到这种行为上的差异?