<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 5, comments - 24, trackbacks - 0, articles - 20
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    AppFuse學(xué)習(xí)筆記-模型層 5

    Posted on 2007-04-27 17:11 kook 閱讀(626) 評(píng)論(1)  編輯  收藏 所屬分類: J2EE

    3.3 模型層結(jié)構(gòu)
        Model層為整個(gè)系統(tǒng)的核心部分,完成應(yīng)用的業(yè)務(wù)邏輯及與數(shù)據(jù)庫的通信。AppFuse中將Model分為兩層:持久層和業(yè)務(wù)層。采用Spring+Hibernate框架實(shí)現(xiàn),這里以對(duì)用戶User數(shù)據(jù)的操作為例詳細(xì)闡述其實(shí)現(xiàn)方式。

        對(duì)持久化數(shù)據(jù)的訪問基于DAO(Data Access Object)模式實(shí)現(xiàn)。DAO模式提供了訪問關(guān)系型數(shù)據(jù)庫系統(tǒng)所需的所有接口操作的接口。DAO模式將底層數(shù)據(jù)訪問操作與高層業(yè)務(wù)邏輯分離開,對(duì)上層提供面向?qū)ο蟮臄?shù)據(jù)訪問接口。

        Model層與User相關(guān)的類有:
        POJO:
        User:管理員表的業(yè)務(wù)對(duì)象。
        業(yè)務(wù)層:
        UserManager:業(yè)務(wù)層接口,為控制層所調(diào)用。
        UserManagerImpl:業(yè)務(wù)層接口的實(shí)現(xiàn),調(diào)用持久層接口。
        持久層:
        UserDAO:持久層接口,為業(yè)務(wù)層實(shí)現(xiàn)所調(diào)用。
        UserDAOHibernate:持久層接口的實(shí)現(xiàn)。
        XML配置文件:
        applicationContext-service.xml:業(yè)務(wù)層接口的配置文件。
        applicationContext-hibernate.xml:持久層接口的配置文件。

    3.3.2 Spring的IoC
        Ioc(Inversion of Control)即反轉(zhuǎn)控制。Ioc模式即Dependency Injection模式是依賴注射的意思,也就是將依賴先剝離,然后在適當(dāng)時(shí)候再注射進(jìn)入。
        Spring的輕量級(jí)的bean容器為業(yè)務(wù)對(duì)象(business objects)、DAO對(duì)象和資源(如:JDBC數(shù)據(jù)源或者Hibernate SessionFactorie等)對(duì)象提供了IoC類型的裝配能力。Spring使用一個(gè)xml格式的應(yīng)用配置文件為開發(fā)者提供了一種通過解析定制的屬性文件來手動(dòng)管理單實(shí)例對(duì)象或者工廠對(duì)象的選擇性。由于Spring將非入侵性做為一個(gè)重要的目標(biāo),因此可以由Spring配置管理的bean對(duì)象均不需要依賴Spring自有的接口和類就可以通過它們的bean屬性完成配置。
        就實(shí)現(xiàn)上來講Spring采取了配置文件的形式來實(shí)現(xiàn)依賴的注射,并且支持Type2 IOC(Setter Injection)以及Type3 IOC(Constructor Injection)。
        在Model層,使用Spring提供的Setter Injection(type2)注入方式。以User為例,下面是其用法。
        在applicationContext- hibernate.xml中定義
       

    1<bean id="userDAO" class="org.appfuse.dao.hibernate.UserDAOHibernate">
    2        <property name="sessionFactory"><ref local="sessionFactory"/></property>
    3    </bean>
    4

        在UserManager類中有一句:
        public void setUserDAO(UserDAO dao);
        這就是一個(gè)DAO Object設(shè)置方法(注射器)。UserDAO將被調(diào)用,和持久層通信。以這種方式創(chuàng)建UserDAO的實(shí)例,同樣達(dá)到了由UserManager創(chuàng)建UserDao的目的。避免了直接實(shí)例化UserDAO的實(shí)現(xiàn)而使業(yè)務(wù)層和持久層緊密耦合。
     

        在控制層調(diào)用業(yè)務(wù)層方法時(shí),使用服務(wù)定位器返回給Spring context,Spring的BeanFactory提供了getBean方法。BeanFactory是一個(gè)通用的Factory,它使對(duì)象能夠按名稱獲取,并且能管理對(duì)象之間的關(guān)系。
        在applicationContext-service.xml中配置
       

    1<bean id="userManager" parent="txProxyTemplate">
    2        <property name="target">
    3            <bean class="org.appfuse.service.impl.UserManagerImpl">
    4                <property name="userDAO"><ref bean="userDAO"/></property>
    5            </bean>
    6        </property>
    7    </bean>
    8

        在控制層BaseAction定義通用方法: 
       

    1 private static ApplicationContext ctx = null;
    2    public Object getBean(String name) {
    3        if (ctx == null{
    4            ctx = WebApplicationContextUtils
    5                    .getRequiredWebApplicationContext(servlet.getServletContext());
    6        }

    7        return ctx.getBean(name);
    8    }

    9

        在UserAction中創(chuàng)建UserManager的實(shí)例:
            UserManager mgr = (UserManager) getBean("userManager");
        這樣,通過BeanFactory的getBean方法,以及xml配置文件,避免了在UserAction類中直接實(shí)例化UserManager,消除了控制層與業(yè)務(wù)層及業(yè)務(wù)層與持久層之間的耦合,實(shí)現(xiàn)了依賴的注射。
        ApplicationContext 是BeanFactory的子接口,為下列東西提供支持:
            信息查找,支持著國際化
            事件機(jī)制,允許發(fā)布應(yīng)用對(duì)象以及可選的注冊(cè)以接收到事件
            可移植的文件和資源訪問

    3.3.3 Spring的事務(wù)管理
        在數(shù)據(jù)持久層的杰出貢獻(xiàn),可能是Spring最為閃亮的優(yōu)點(diǎn)。
        Spring提供了通過容器的集約式參數(shù)化事務(wù)機(jī)制,實(shí)現(xiàn)事務(wù)的外部管理。容器管理的參數(shù)化事務(wù)為程序開發(fā)提供了相當(dāng)?shù)撵`活性,同時(shí)因?yàn)閷⑹聞?wù)委托給容器進(jìn)行管理,應(yīng)用邏輯中無需再編寫事務(wù)代碼,大大節(jié)省了代碼量(特別是針對(duì)需要同時(shí)操作多個(gè)事務(wù)資源的應(yīng)用),從而提高了生產(chǎn)率。
        AppFuse在applicationContext-service.xml文件中進(jìn)行了對(duì)事務(wù)的配置
       

     1<bean id="txProxyTemplate" abstract="true"
     2        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
     3        <property name="transactionManager"><ref bean="transactionManager"/></property>
     4        <property name="transactionAttributes">
     5            <props>
     6                <prop key="save*">PROPAGATION_REQUIRED</prop>
     7                <prop key="remove*">PROPAGATION_REQUIRED</prop>
     8                <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
     9            </props>
    10        </property>
    11    </bean>
    12

        這里定義了一個(gè)名為txProxyTemplate的TransactionProxyFactoryBean服務(wù)。它對(duì)包含實(shí)際數(shù)據(jù)邏輯的持久層對(duì)象進(jìn)行了事務(wù)的封裝。在這里,通過transactionAttributes屬性,我們指定了事務(wù)的管理策略,即將所有的名稱以save和remove開頭的方法納入事務(wù)管理范圍。如果此方法中拋出異常,則Spring將當(dāng)前事務(wù)回滾,如果方法正常結(jié)束,則提交事務(wù)。
        而對(duì)所有其它方法則以只讀的事務(wù)處理機(jī)制進(jìn)行處理。設(shè)為只讀型事務(wù),可以使持久層嘗試對(duì)數(shù)據(jù)操作進(jìn)行優(yōu)化,如對(duì)于只讀事務(wù)Hibernate將不執(zhí)行flush操作,而某些數(shù)據(jù)庫連接池和JDBC 驅(qū)動(dòng)也對(duì)只讀型操作進(jìn)行了特別優(yōu)化。
        如果有其他的方法需要進(jìn)行寫數(shù)據(jù)庫操作,可以在相應(yīng)的Manager配置中聲明。如在UserManager中,就添加了屬性
           

    1<property name="transactionAttributes">
    2            <props>
    3                <prop key="save*">PROPAGATION_REQUIRED</prop>
    4                <prop key="remove*">PROPAGATION_REQUIRED</prop>
    5                <prop key="*LoginCookie">PROPAGATION_REQUIRED</prop>
    6                <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
    7            </props>
    8        </property>
    9

        這樣,以LoginCookie結(jié)尾的方法也可以寫數(shù)據(jù)庫了。
        Spring可以將任意Java Class 納入事務(wù)管理,而無需對(duì)其進(jìn)行任何修改,因此我們的類可能完全不知道它正在被進(jìn)行事務(wù)管理。


    3.3.3 Spring+Hibernate操作持久層
        Spring對(duì)Hibernate有很好的支持。
        Hibernate中通過SessionFactory創(chuàng)建和維護(hù)Session。Spring對(duì)SessionFactory的配置進(jìn)行了整合,無需再通過Hibernate.cfg.xml對(duì)SessionFactory進(jìn)行設(shè)定。SessionFactory節(jié)點(diǎn)的mappingResources屬性包含了映射文件的路徑,list節(jié)點(diǎn)下可配置多個(gè)映射文件。hibernateProperties節(jié)點(diǎn)則容納了所有的屬性配置。可以對(duì)應(yīng)傳統(tǒng)的Hibernate.cfg.xml文件結(jié)構(gòu)對(duì)這里的SessionFactory配置進(jìn)行解讀。
        下面是HibernateSessionFactory 和 HibernateTransactionManager的配置:
        在applicationContext-hibernate.xml中:
       

    <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
            
    <property name="dataSource"><ref bean="dataSource"/></property>
            
    <property name="mappingResources">
                
    <list>
                    
    <value>com/mycompany/model/User.hbm.xml</value>
                    ……………………………
                
    </list>
            
    </property> 

            
    <property name="hibernateProperties">
            
    <props>
                
    <prop key="hibernate.dialect">@HIBERNATE-DIALECT@</prop>
                
    <!--prop key="hibernate.show_sql">true</prop-->
                
    <!--prop key="hibernate.hbm2ddl.auto">update</prop-->
            
    </props>
            
    </property>
        
    </bean> 

        Spring 提供了一個(gè) HibernateTransactionManager,采用面向Hibernate的TransactionManager實(shí)現(xiàn):org.springframework.orm.hibernate.HibernateTransactionManager。他用線程捆綁了一個(gè)Hibernate Session,用它來支持transactions。
       

    <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
            
    <property name="sessionFactory"><ref local="sessionFactory"/></property>
        
    </bean> 

        sessionFactory Bean引用了HibernateSessionFactory,而transactionManager Bean引用了HibernateTransactionManage。 transactionManager Bean中有個(gè)sessionFactory屬性。 HibernateTransactionManager有個(gè)sessionFactory setter 和 getter方法,用來在Spring啟動(dòng)的時(shí)候?qū)崿F(xiàn)“依賴注入” (dependency injection)的。 在sessionFactory 屬性里引用sessionFactory Bean。這兩個(gè)對(duì)象在Spring容器初始化后就被組裝了起來了。
     
        User使用一個(gè)TransactionProxyFactoryBean,它定義了一個(gè)setTransactionManager()。能很方便的處理申明的事物還有Service Object。TransactionProxyFactoryBean 還有個(gè)setter. 這會(huì)被Business service object(UserManager)引用, UserManager定義了業(yè)務(wù)層,并且它還有個(gè)屬性,由setUserDAO()引用。

        系統(tǒng)持久層中所有的類都繼承自Spring提供的HibernateDaoSupport類,HibernateSupport實(shí)現(xiàn)了HibernateTemplate和SessionFactory實(shí)例的關(guān)聯(lián)。HibernateTemplate對(duì)Hibernate Session操作進(jìn)行了封裝,提供了一個(gè)簡單的方式實(shí)現(xiàn)了Hibernate-based DAO對(duì)象。借助HibernateTemplate我們可以脫離每次數(shù)據(jù)操作必須首先獲得Session實(shí)例、啟動(dòng)事務(wù)、提交/回滾事務(wù)以及煩雜的try/catch/finally的繁瑣操作。一個(gè)簡單的Hibernate訪問方法就完全解決了些麻煩! 無論是在多個(gè)DAO接口還是在多方事務(wù)的情況下,Spring使得多種DAO對(duì)象無縫地協(xié)同工作。
        對(duì)于簡單的單步的動(dòng)作,象find, load, saveOrUpdate或者delete的調(diào)用,HibernateTemplate提供更為便利的選擇以代替象一行的回調(diào)的執(zhí)行。此外HibernateDaoSupport類提供了setSessionFactory方法來接受一個(gè)SessionFactory,同時(shí)提供了getSessionFactory和getHibernateTemplate方法供其繼承類使用。將這些結(jié)合起來,允許對(duì)于典型的需求給出了非常簡單的DAO實(shí)現(xiàn),如獲得所有用戶的方法:
       

     public List getUsers(User user) {
            
    return getHibernateTemplate().find("from User u order by upper(u.username)");
        }


    評(píng)論

    # re: AppFuse學(xué)習(xí)筆記-模型層 5[未登錄]  回復(fù)  更多評(píng)論   

    2008-08-19 12:12 by Thomas
    AppFuse 2.0.2發(fā)布了。能不能結(jié)合AppFuse 2.0.2進(jìn)行描述。
    主站蜘蛛池模板: 99精品视频在线观看免费播放| 亚洲一区精品中文字幕| 69视频免费观看l| 特级毛片A级毛片免费播放| 91亚洲va在线天线va天堂va国产| 免费一级毛片在级播放| 91免费国产在线观看| 在线观看免费视频一区| 美女裸免费观看网站| 亚洲熟妇久久精品| 亚洲免费电影网站| 亚洲伊人久久大香线蕉苏妲己| 亚洲精品乱码久久久久久蜜桃| 国产精品无码免费播放| 欧洲一级毛片免费| 免费在线观看一级片| 国产亚洲蜜芽精品久久| 亚洲国产精品综合久久2007| 亚洲va无码va在线va天堂| 国产亚洲一区区二区在线| 波多野结衣一区二区免费视频| 国产在线观看免费观看不卡| 十八禁在线观看视频播放免费| 国产精品亚洲片在线花蝴蝶| 亚洲噜噜噜噜噜影院在线播放| 亚洲国产美女精品久久久久∴| 全部免费毛片免费播放| 大学生美女毛片免费视频| 99re6在线精品视频免费播放| 一区二区三区视频免费观看| 亚洲熟妇AV一区二区三区宅男| 久久久久亚洲AV无码永不| 久久精品国产亚洲7777| 日本黄色免费观看| 国产美女被遭强高潮免费网站| 免费A级毛片无码视频| 免费在线中文日本| h片在线播放免费高清| 免费精品国自产拍在线播放 | 国产成人精品免费直播| 久久天天躁狠狠躁夜夜免费观看|