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