Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          2.5. 需要改造的地方

          JpetStore4.0的關鍵就在struts Action類和form bean類上,這也是其精華之一(雖然該實現方式是試驗性,待擴充和驗證),在此次改造中我們要保留下來,即控制層一點不變,表現層獲取相應業務類的方式變了(要加載spring環境),其它保持不變。要特別關注的改動是業務層和持久層,幸運的是JpetStore4.0設計非常好,需要改動的地方非常少,而且由模式可循,如下:

          1. 業務層和數據層用Spring BeanFactory機制管理。
          2. 業務層的事務由spring 的aop通過聲明來完成。
          3. 表現層(form bean)獲取業務類的方法改由自定義工廠類來實現(加載spring環境)。

          3. JPetStore的改造

          3.1. 改造后的架構



          其中紅色部分是要增加的部分,藍色部分是要修改的部分。下面就讓我們逐一剖析。

          3.2. Spring Context的加載
          為了在Struts中加載Spring Context,一般會在struts-config.xml的最后添加如下部分:

          <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
                      <set-property property="contextConfigLocation"
                      value="/WEB-INF/applicationContext.xml" />
                      </plug-in>


          Spring在設計時就充分考慮到了與Struts的協同工作,通過內置的Struts Plug-in在兩者之間提供了良好的結合點。但是,因為在這里我們一點也不改動JPetStore的控制層(這是JpetStore4.0的精華之一),所以本文不準備采用此方式來加載ApplicationContext。我們利用的是spring framework 的BeanFactory機制,采用自定義的工具類(bean工廠類)來加載spring的配置文件,從中可以看出Spring有多靈活,它提供了各種不同的方式來使用其不同的部分/層次,您只需要用你想用的,不需要的部分可以不用。

          具體的來說,就是在com.ibatis.spring包下創建CustomBeanFactory類,spring的配置文件applicationContext.xml也放在這個目錄下。以下就是該類的全部代碼,很簡單:

          public final class CustomBeanFactory {
                      static XmlBeanFactory factory = null;
                      static {
                      Resource is = new
                      InputStreamResource( CustomBeanFactory.class.getResourceAsStream("applicationContext.xml"));
                      factory = new XmlBeanFactory(is);
                      }
                      public static Object getBean(String beanName){
                      return factory.getBean(beanName);
                      }
                      }


          實際上就是封裝了Spring 的XMLBeanFactory而已,并且Spring的配置文件只需要加載一次,以后就可以直接用CustomBeanFactory.getBean("someBean")來獲得需要的對象了(例如someBean),而不需要知道具體的類。CustomBeanFactory類用于{耦合1}的解耦。CustomBeanFactory類在本文中只用于表現層的form bean對象獲得service類的對象,因為我們沒有把form bean對象配置在applicationContext.xml中。但是,為什么不把表現層的form bean類也配置起來呢,這樣就用不著這CustomBeanFactory個類了,Spring會幫助我們創建需要的一切?問題的答案就在于form bean類是struts的ActionForm類!如果大家熟悉struts,就會知道ActionForm類是struts自動創建的:在一次請求中,struts判斷,如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中。因此formbean類的對象就不能由spring來創建,但是service類以及數據層的DAO類可以,所以只有他們在spring中配置。所以,很自然的,我們就創建了CustomBeanFactory類,在表現層來銜接struts和spring。就這么簡單,實現了另一種方式的{耦合一}的解耦。

          3.3. 表現層

          面分析到,struts和spring是在表現層銜接起來的,那么表現層就要做稍微的更改,即所需要的service類的對象創建上。以表現層的AccountBean類為例:原來的源代碼如下

          private static final AccountService accountService
                      = AccountService.getInstance();
                      private static final CatalogService catalogService
                      = CatalogService.getInstance();


          改造后的源代碼如下

          private static final AccountService accountService
                      = (AccountService)CustomBeanFactory.getBean("AccountService");
                      private static final CatalogService catalogService
                      = (CatalogService)CustomBeanFactory.getBean("CatalogService");


          其他的幾個presentation類以同樣方式改造。這樣,表現層就完成了。關于表現層的其它部分如JSP等一概不動。也許您會說,沒有看出什么特別之處的好處?。磕氵€是額外實現了一個工廠類。別著急,帷幕剛剛開啟,spring是在表現層引入,但您發沒發現:

          presentation類僅僅面向service類的接口編程,具體"AccountService"是哪個實現類,presentation類不知道,是在spring的配置文件里配置。(本例中,為了最大限度的保持原來的代碼不作變化,沒有抽象出接口)。Spring鼓勵面向接口編程,因為是如此的方便和自然,當然您也可以不這么做。

          CustomBeanFactory這個工廠類為什么會如此簡單,因為其直接使用了Spring的BeanFactory。Spring從其核心而言,是一個DI容器,其設計哲學是提供一種無侵入式的高擴展性的框架。為了實現這個目標,Spring 大量引入了Java 的Reflection機制,通過動態調用的方式避免硬編碼方式的約束,并在此基礎上建立了其核心組件BeanFactory,以此作為其依賴注入機制的實現基礎。org.springframework.beans包中包括了這些核心組件的實現類,核心中的核心為BeanWrapper和BeanFactory類。
          posted on 2007-12-05 16:03 禮物 閱讀(363) 評論(0)  編輯  收藏 所屬分類: ibatis + spring
          主站蜘蛛池模板: 大姚县| 溆浦县| 西藏| 遂溪县| 鸡泽县| 蒙城县| 华阴市| 四平市| 射洪县| 九龙坡区| 四子王旗| 和平县| 浪卡子县| 连山| 白朗县| 湄潭县| 西华县| 莆田市| 通辽市| 陕西省| 新乡市| 桦甸市| 于田县| 资源县| 抚远县| 沧源| 陆丰市| 休宁县| 定边县| 桐乡市| 毕节市| 柏乡县| 遂昌县| 北流市| 墨脱县| 神池县| 广汉市| 西贡区| 肃宁县| 石家庄市| 洞头县|