日期:2014-05-19  浏览次数:20769 次

《Real World Java EE Patterns》阅读笔记 01:服务门面

对于任何一种技术来说,好用和用好是两个不同的概念。《Real World Java EE Patterns: Rethinking Best Practices》(真实世界 Java EE 模式:重新思考最佳实践)就是教我们如何用好 Java EE 的一本书,也是目前市面上能找到的唯一一本,非常值得一读。前两章是一些概述性的文字,所以直接从第 3 章“Rethinking the Business Tier(重新思考业务层)”开始。这次是第 1 节“Service Fa?ade (Application Service)(服务门面(应用程序服务))”的阅读笔记。

概述

本节的开头对 Java EE 中的服务门面进行了简介,下面是我的归纳。服务门面的作用是将独立且可重用服务的组合起来,其概念和门面模式差不多,只不过要加上一些 Java EE 所特有的东西。 它是一个带本地接口的会话 Bean(通常是无态的)。除非需要从 JVM 之外进行访问,否则不应当提供远程接口。它充当展示层和业务层之间的界限,其方法都由客户端调用,不应当出现门面之间相互调用的情况。任何客户端和门面间 的交互都属于业务会话,每次调用都启动一个新的事务,因此门面类需要带有 TransactionAttributeType.REQUIRES_NEW 注解。

策略

然后作者讨论了各种服务门面的实现策略,它们是本节的重点:

CRUD 门面

一个 CRUD 门面只是一个暴露的、事务性的 DAO。在 J2EE 时代,通常将服务门面的所有方法调用委托给后台的 DAO。EJB 3.0 本来就是 POJO,所以这种委托已经显得多余了。在 EJB 3.1 里,甚至连 EJB 接口都是可选的,例如:

?
1
2
3
@Stateless
@TransactionAttribute (TransactionAttributeType.REQUIRES_NEW)
public class BookService { //...

双视图门面

服务门面通常都由部署在同一个 ear 中的 Web 组件直接访问,但有时候也需要提供远程接口供外部客户端使用(例如使用 Swing 开发的 EJB 客户端应用程序)。这种情况就可以使用双视图:

?
1
2
3
4
5
6
7
8
9
public interface BookServiceRemote { //...
?
public interface BookServiceLocal extends BookServiceLocal { //...
?
@Stateless
@Local (BookServiceLocal. class )
@Remote (BookServiceRemote. class )
@TransactionAttribute (TransactionAttributeType.REQUIRES_NEW)
public class