paulwong

          《真實(shí)世界 Java EE 模式》閱讀筆記 01:重新思考業(yè)務(wù)層

          對于任何一種技術(shù)來說,好用和用好是兩個(gè)不同的概念。《真實(shí)世界 Java EE 模式:重新思考最佳實(shí)踐》(Real World Java EE Patterns: Rethinking Best Practices)就是教我們?nèi)绾斡煤?Java EE 的一本書,也是目前市面上能找到的唯一一本,非常值得一讀。前兩章是一些概述性的文字,所以直接從第 3 章“服務(wù)門面(應(yīng)用程序服務(wù))”(Service Façade (Application Service))開始。

          概述

          本章的開頭對 Java EE 中的服務(wù)門面進(jìn)行了簡介,下面是我的歸納。服務(wù)門面的作用是將獨(dú)立且可重用服務(wù)的組合起來,其概念和門面模式差不多,只不過要加上一些 Java EE 所特有的東西。 它是一個(gè)帶本地接口的會話 Bean(通常是無態(tài)的)。除非需要從 JVM 之外進(jìn)行訪問,否則不應(yīng)當(dāng)提供遠(yuǎn)程接口。它充當(dāng)展示層和業(yè)務(wù)層之間的界限,其方法都由客戶端調(diào)用,不應(yīng)當(dāng)出現(xiàn)門面之間相互調(diào)用的情況。任何客戶端和門面間的交互都屬于業(yè)務(wù)會話,每次調(diào)用都啟動一個(gè)新的事務(wù),因此門面類需要帶有TransactionAttributeType.REQUIRES_NEW 注解。

          策略
          接下來作者討論了各種服務(wù)門面的實(shí)現(xiàn)策略,它們是本章的重點(diǎn):

          CRUD 門面
          一個(gè) CRUD 門面只是一個(gè)暴露的、事務(wù)性的 DAO。在 J2EE 時(shí)代,通常將服務(wù)門面的所有方法調(diào)用委托給后臺的 DAO。EJB 3.0 本來就是 POJO,所以這種委托已經(jīng)顯得多余了。在 EJB 3.1 里,甚至連 EJB 接口都是可選的,例如:  
          @Stateless
          @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
          public class BookService 
           
              @PersistenceContext
              
          private EntityManager em; 
           
              
          public void createBook(Book book) 
                  em.persist(book); 
              }
           
           
              
          // 
           
          }
            


          雙視圖門面
          服務(wù)門面通常都由部署在同一個(gè) ear 中的 Web 組件直接訪問,但有時(shí)候也需要提供遠(yuǎn)程接口供外部客戶端使用(例如使用 Swing 開發(fā)的 EJB 客戶端應(yīng)用程序)。這種情況就可以使用雙視圖:  
          public interface BookServiceRemote {// 
           
          public interface BookServiceLocal extends BookServiceLocal {// 
           
          @Stateless
          @Local(BookServiceLocal.
          class
          @Remote(BookServiceRemote.
          class
          @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
          public class BookService implements BookServiceLocal {//  


          SOA 門面
          SOA 門面的一大特點(diǎn)就是異步,最容易想到的方式就是 JMS,但 JMS 消費(fèi)者在對事務(wù)和消息類型的處理上有些微妙的問題,JMS 生產(chǎn)者和消費(fèi)者之間不容易交互,而且部署和維護(hù)消息隊(duì)列的成本也比較高。EJB 3.1 引入的異步調(diào)用則提供了一種輕量級的異步門面解決方案,簡單自然地解決了這些問題:  
          @Stateless
          @Asynchronous
          public class BookService 
           
              
          public Future<Order> orderBook(Book book) 
                  
          // 
                  return new AsyncResult<Order>(order); 
              }
           
           
          }
            


          多通道門面
          通過在門面上增加注解,可以使同一個(gè)門面以更多的形式暴露出來。下面代碼中的門面不僅是一個(gè) EJB,而且能夠提供 SOAP 和 RESTful 的 Web 服務(wù):  
          @Stateless
          @WebService
          @Path(
          "book"
          public class BookService {//


          IIOP 門面
          這種門面主要用于和 CORBA / IIOP 兼容,例如可用于和老系統(tǒng)或者 .NET 客戶端通信。在一般的 Java 開發(fā)中應(yīng)該很少用到。

          總結(jié)
          雖然本章有很多理論性的東西,但實(shí)際上都是圍繞 EJB 3.0/3.1 的新特性在講。正如作者所說,J2EE 時(shí)代的諸多模式都是出于對規(guī)范的短處進(jìn)行修補(bǔ),而并非設(shè)計(jì)上的最佳實(shí)踐。這讓我想起以前從阿三手上接過來的一個(gè)項(xiàng)目,雖然使用 EJB 3.0,但充斥著大量 EJB 2.x 的“設(shè)計(jì)模式”,造成大量冗余的代碼,甚至很多方法委托就是透傳。我當(dāng)時(shí)雖然覺得不妥,但也沒有充足的理由反駁阿三架構(gòu)師,實(shí)在是可惜了。

          posted on 2011-05-22 11:39 paulwong 閱讀(371) 評論(0)  編輯  收藏 所屬分類: J2EE

          主站蜘蛛池模板: 达日县| 务川| 固镇县| 永川市| 尼木县| 进贤县| 依安县| 年辖:市辖区| 南澳县| 大英县| 汪清县| 泰安市| 荔波县| 怀安县| 教育| 丰镇市| 辽阳市| 根河市| 峨山| 奉节县| 洛阳市| 台州市| 和平区| 无极县| 荣昌县| 阿拉善左旗| 大洼县| 宁蒗| 万载县| 桓仁| 蓬莱市| 龙胜| 汉川市| 苏尼特左旗| 阿瓦提县| 裕民县| 河南省| 蓬溪县| 平邑县| 余江县| 乐亭县|