EJB 3.1 @LocalBean vs没有注释
我了解本地视图,远程视图和无界面视图的区别。 我只是不明白“无视图”(无注释)和无界面视图之间有什么区别。 另外为什么我应该用@Local
注释我的界面? 如果我根本不注释界面,有什么区别?
规则是(从记忆):
- Bean有一个
@LocalBean
注解 – > bean有一个无界面视图 - Bean有一个
@Local
注解 – > bean有一个本地视图 - Bean有一个
@Remote
注解 – > bean有一个远程视图 - Bean没有视图注释,但直接实现了一个拥有@Local注解的接口 – > bean有一个本地视图
- Bean没有视图注释,但是直接实现了一个接口,它有一个@Remote注解 – > bean有一个远程视图
- Bean没有视图注释,但直接实现了一个没有视图注释的接口 – > bean有一个本地视图
- Bean没有视图注释,并且没有实现接口 – > bean有一个无接口的视图
因此,使用@LocalBean
并且根本不使用注释都是获取无界面视图的方法。 如果你只是想要一个无界面的视图,那么最简单的事情就是不要注释。 假设你还没有实现任何接口。
部分原因@LocalBean
存在添加一个无界面的视图到一个也有接口视图的bean。 我想在规范作者脑海里最重要的场景就是你拥有一个bean的地方:
@Stateless public class UserPreferences { public String getPreference(String preferenceName); public Map<String, String> getPreferences(); }
您希望在本地公开这两种方法的位置,而只是远程地使用较粗粒度的getPreferences()
。 你可以通过用这个方法声明一个远程接口来实现,然后在Bean类上使用@LocalBean
。 没有它,你必须编写一个毫无意义的本地接口,以在本地公开这两种方法。
或者,从另一个angular度来看,存在@LocalBean
是因为存在无界面视图这样的事情,并且没有注释选项作为一个方便的快捷方式存在。
- 远程EJB:可以从远程客户端(在不同JVM上运行的客户端,例如在用户机器上运行的Swing或JavaFX客户端)访问,
- 本地EJB:只能从运行在同一个JVM上的其他“组件”访问,例如Web前端,其他EJB
- 无界面视图:与本地相同,但不指定业务界面
- 没有注释:一个简单的POJO,但不是一个EJB
本地/无界面视图比远程EJB更有效率,因为对象引用可以被传递。
我认为你/我们感到的困惑是历史/向后兼容性的结果(可以这么说)。 我不能区分任何区别(除了规范要求实现创build一个接口,如果我们使用本地视图)
无接口视图具有与EJB 3.0本地视图相同的行为,例如,它支持传递引用调用语义,事务和安全传播等function。 但是,无界面视图不需要单独的接口,也就是说,bean类的所有公共方法都会自动暴露给调用者。 默认情况下,任何具有空的implements子句并且没有定义任何其他本地或远程客户端视图的会话bean将公开无客户端视图。
Oracle Blog发布之前的EJB 3.1
如果您对更多的技术细节感兴趣,那就让我说一下真正发生的事情….您无法直接访问EJB对象,这意味着您没有实际EJB对象的引用(地址)。 在查找或注入EJB时,容器提供一个对象作为该EJB的客户端(我们可以调用代理或包装器),并且在该代理对象上调用业务方法。 (这就是为什么你不应该使用new关键字来创buildEJB类的对象)
现在,对于每种types的注释,容器都会生成具有不同方法和function的不同types的代理。
@LocalBean
(或没有注释)你的代理对象有:
-
setOptionalLocalIntfProxy()
-
getSerializableObjectFactory()
@Local
你的代理对象使用本地调用和com.sun.proxy
types所以它有:
-
getSerializableObjectFactory()
-
isProxyClass()
-
getProxyClass()
-
getInvocationHandler()
-
newProxyInstance()
@Remote
你包装对象使用远程调用,它有:
-
readResolve()
-
writeReplace()
-
getStub()
-
getBusinessInterfaceName()