我是EJB3的新手。我想知道客户端如何知道EJB bean实现是在远程还是本地。当我在客户端类中使用InitialContext访问bean时,我想知道bean是本地的还是远程的?对不起,如果我问的是愚蠢的问题?
答案 0 :(得分:2)
接口类型通过注释确定。
这些可以放在Interface类声明旁边:
@Local
- 声明本地业务接口
@Remote
- 声明远程业务接口
然后,当EJB扩展此类接口时,它将该接口用作本地/远程视图。如果它扩展了多个接口,则它有多个视图。
这些可以放在EJB类声明旁边:
@Local(com.example.LocalInterfaceClass)
- 声明本地业务接口
@Remote(com.example.SomeRemoteInterfaceClass)
- 声明一个远程业务接口
@LocalBean
- 声明一个无界面视图(用作界面的完整bean定义)
如果组合使用多个上述注释,则EJB具有多个接口视图。如果全部省略,则bean默认为无接口视图。
您可以使用JDK内置注释处理在编译期间处理注释(通过javax.annotation.processing类和javac命令行选项)。例如。您可以生成代码或设置选项/开关。
您可以使用反射来确定运行时的注释。
可能最干净,最简单的是没有动态查找&行为,但只是为每个客户端提交本地或远程,并硬编码适当的行为。
答案 1 :(得分:0)
编写EJB时,有两种不同的接口可用。一个是远程的,一个是本地的。远程,顾名思义是远程客户端想要远程调用(或触发)函数并获得一些结果。另一方面,Local设计用于本地环境,例如,如果系统中的另一个EJB甚至POJO正在使用它。用法与您希望使用其Remote接口使用EJB时的用法相同。但是,服务器处理它的难度较小。这是您可能希望使用Local接口而不是Remote接口的唯一原因。本地接口不是JVM的本地接口,而是像其他POJO类一样本地接口。
无法访问本地客户端视图:
当EJB或Web组件打包在不同应用程序的EAR包中时。 当Web组件部署在Web容器中,并且EJB部署在EJB容器中时,这些容器是分开的(即使它们在同一台机器上运行)
这些是考虑本地或远程接口的主要因素:
客户端:如果您的客户端不是Web组件或其他bean,则不使用Local 豆类和豆类:豆类松散耦合吗?那么使用Local是个好主意 可扩展性:远程总是更好的可扩展性 建议实体bean使用本地接口,这有助于解决性能问题。
更多内容阅读:
答案 2 :(得分:0)
使用界面的@Remote可以用作远程界面
@Remote
public interface Cart {
}
现在,实现EJB bean的这个接口。
@Stateful
public class CartBean implements Cart {
}
同样使用@Local注释,您可以将其用作本地界面。