好的,EJB 2.1 or earlier client view 需要一个主界面和组件界面。在 JEE7 (EJB 3.x API) 中,这是可选的。
如果您创建Local 或Remote 接口,这取决于您的决定,例如,如果您的 SessionBean 处理客户的订单并与计费 bean 一起工作,那么它将是@987654325 的良好候选者@。
如果您的 Bean 将被其他客户端访问,例如在您之外Glassfish,那么你应该启用远程访问。
默认情况下,JEE7 中没有注解的接口是@Local
本地客户
- 在同一虚拟机上运行
- 它可能是一个会话 Bean 或另一个 Web 组件
本地客户:
@Local
public interface OrderServiceLocal {
// ...
}
@Local(OrderServiceLocal.class)
@Stateless
public class OrderService implement OrderServiceLocal {
// ...
}
在您的 CDI Bean 中,您可以像这样使用 OrderService:
@Named(name = "MyCDIBean")
@SessionScoped
public class MyCDIBean {
// ...
// your applicationserver creates an instance of
// the Service if it is needed
// and he also handles the lifecycle
@Inject
OrderServiceLocal orderService;
// ...
public List<Orders> listOrders() {
return orderService.listOrders();
}
}
远程客户端
- 远程客户端可以在不同的 JVM 或/和不同的机器上运行
- 应该访问的 Bean 必须实现远程接口,因为远程客户端无法通过非接口视图访问
远程接口
@Remote
public interface OrderServiceRemote {
// methods
}
@Remote(OrderServiceRemote.class)
@Stateless
public class OrderService implement OrderServiceRemote {
// do something cool in here ;)
}
@Named(name = "MyCDIBean")
@SessionScoped
public class MyCDIBean {
// ...
// your applicationserver creates an instance of
// the Service if it is needed
// and he also handles the lifecycle
@Inject
OrderServiceLocal orderService;
// ...
public List<Orders> listOrders() {
return orderService.listOrders();
}
}
两个接口都定义了特定于 Bean 的 Business 和 Lifecycle 方法。
不同之处还在于 Local 或 Remote 视图的 JNDI 查找,例如,如果您编写自己的客户端并使用 InitialContext.lookup() 获取访问权限。
@Local
OrderServiceLocal osl = (OrderServiceLocal)
InitialContext.lookup("java:module/OrderServiceLocal");
@Remote
OrderServiceRemote osr = (OrderServiceRemote)
InitialContext.lookup("java:global/myApp/OrderServiceRemote");
所以,我希望这对您有所帮助,我需要将其写为答案,因为文本和列表会很长,需要评论。
帕特里克