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

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

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

    posts - 64,  comments - 9,  trackbacks - 0
    Sping2.0 + Struts2.0 +Ibatis 的使用總結(jié)

    最近工作中涉及到一些將其他項目組的應(yīng)用整合到我們平臺上的事情。剛好那個項目是baseAppfuse提供的框架基礎(chǔ)上開發(fā)的。使用了Spring2.0 + Struts2.0 + Ibatis的框架。趁此機會把這幾個外面現(xiàn)在比較流行的東西又好好看了看。現(xiàn)在寫個總結(jié)。也希望能便于以后的參考。好了,元歸正傳,開始我們的SSI之旅。

             我們還是從代碼講起。這樣也便于我們理解。否則High Level的東西說了一通到最后也不知道都說明了什么。

             先看幾段代碼:

             Spring DataSoure

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

            <property name="driverClassName" value="${jdbc.driverClassName}"/>

            <property name="url" value="${jdbc.url}"/>

            <property name="username" value="${jdbc.username}"/>

            <property name="password" value="${jdbc.password}"/>

            <property name="maxActive" value="${jdbc.maxActive}"/>

            <property name="maxIdle" value="${jdbc.maxIdle}"/>

            <property name="maxWait" value="${jdbc.maxWait}"/>

            <property name="defaultAutoCommit" value="true"/>

            <property name="removeAbandoned" value="true"/>

            <property name="removeAbandonedTimeout" value="60"/>

            <!-- 以下配置用于開發(fā)時追蹤沒有釋放數(shù)據(jù)庫連接的代碼,部署時應(yīng)刪除 -->

            <property name="logAbandoned" value="true"/>

     </bean>

             這里我們使用dbcp連接池。這里就不多說了。

             Spring AOP Configuration

             <bean id="txManager"

             class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

             <property name="dataSource">

                  <ref bean="dataSource"/>

             </property>

         </bean>

         <tx:advice id="txAdvice" transaction-manager="txManager">

             <!-- the transactional semantics... -->

             <tx:attributes>

                  <!-- all methods starting with 'get' are read-only -->

                  <tx:method name="get*" read-only="true" />

                  <!-- other methods use the default transaction settings (see below) -->

                  <tx:method name="*" rollback-for="Exception" />

             </tx:attributes>

         </tx:advice>

     

         <aop:config>

             <aop:pointcut id="serviceOperation"

                  expression="execution(* com.ibm.magis..service.*Manager.*(..))" />

             <aop:advisor advice-ref="txAdvice"

                  pointcut-ref="serviceOperation" />

         </aop:config>

             這里就和我們以前用的Spring就不一樣了。這里我們使用的是AspectJ 的切面事務(wù)的統(tǒng)一控制。 Spring的官方文檔說:“如果你選擇使用Spring AOP,那么你可以選擇@AspectJ或者XML風(fēng)格。總的來說,如果你使用Java 5我們建議使用@AspectJ風(fēng)格。”當(dāng)然項目中使用的是JDK1.5 所以他使用了這樣的聲明方式。

             回頭看一下我們以前的方法:

                 <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

             <property name="transactionManager">

                  <ref bean="transactionManager" />

             </property>

             <property name="transactionAttributes">

                  <props>

    <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>

    <prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>

    <prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>

    <prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>

    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

                  </props>

             </property>

    </bean>

             兩者相比較而言還是AspectJ的這種風(fēng)格比較好。而且我們可以方邊在Spring中定義我們自己的切面。例如日志的記錄、權(quán)限的檢查等等。

                  <aop:config>

             <aop:aspect id="objectACLAspectU" ref="objectACLAdviceU">

                  <aop:pointcut id="objectRemovePcU" expression="execution(* com.ibm.magis.data.instance.service.OinstanceManager.remove(..)) and args(objectId,instanceId)"/>

             </aop:aspect>

         </aop:config>

         <bean id="objectACLAdviceU" class="com.ibm.magis.acl.advice.ObjectACLUsingAdvice">

           <property name="oinstanceManager" ref="oinstanceManager"/>

           <property name="objectACLManager" ref="objectACLManager"/>

         </bean>

             經(jīng)過簡單的配置在加上一個簡單的實現(xiàn)類就可以完成一些復(fù)雜的切面控制的代碼了。

             看完上面Spring2.0AOP后。在看一個配置文件:

                  <beans default-autowire="byName" default-lazy-init="true">

                <bean id="objectACLDao" class="com.ibm.magis.acl.dao.ibatis.PObjectACLDaoImpl" />

    </beans>

             注意這個屬性default-lazy-init. 如果設(shè)置為true 則表明Spring IOC容器使用Lazy-load的方式進行加載。這種懶加載的方式可從某種情況下提高啟動的速度。但是也會有一個問題哦。可能不會馬上發(fā)現(xiàn)配置錯誤的bean.

             還有一個屬性:default-autowire="byName" 設(shè)置Spring的自動裝配方式。autowire的方便之處在減少或者消除屬性或構(gòu)造器參數(shù)的設(shè)置,這樣可以給我們的配置文件減減肥!

             載至Spring官方文檔

    模式

    說明

    no

    不使用自動裝配。必須通過ref元素指定依賴,這是默認設(shè)置。由于顯式指定協(xié)作者可以使配置更靈活、更清晰,因此對于較大的部署配置,推薦采用該設(shè)置。而且在某種程度上,它也是系統(tǒng)架構(gòu)的一種文檔形式。

    byName

    根據(jù)屬性名自動裝配。此選項將檢查容器并根據(jù)名字查找與屬性完全一致的bean,并將其與屬性自動裝配。例如,在bean定義中將autowire設(shè)置為by name,而該bean包含master屬性(同時提供setMaster(..)方法),Spring就會查找名為masterbean定義,并用它來裝配給master屬性。

    byType

    如果容器中存在一個與指定屬性類型相同的bean,那么將與該屬性自動裝配。如果存在多個該類型的bean,那么將會拋出異常,并指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean,則什么事都不發(fā)生,屬性也不會被設(shè)置。如果你不希望這樣,那么可以通過設(shè)置dependency-check="objects"Spring拋出異常。

    constructor

    byType的方式類似,不同之處在于它應(yīng)用于構(gòu)造器參數(shù)。如果在容器中沒有找到與構(gòu)造器參數(shù)類型一致的bean,那么將會拋出異常。

    autodetect

    通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配。如果發(fā)現(xiàn)默認的構(gòu)造器,那么將使用byType方式。

             這也是一個不錯的地方。可以省去我們很多地方配置的顯示聲明。

    我們可以看一下Struts2.0的使用吧。個人認為其實Struts2.0就是完全照搬的webwork的。沒有多少自己的心意。

             具體的配置就不多說了。主要是看看下面這個配置文件:

    <constant name="struts.i18n.encoding" value="UTF-8"/>

        <constant name="struts.action.extension" value="action"/>

        <constant name="struts.objectFactory" value="spring"/>

             注意<constant name="struts.objectFactory" value="spring"/>

    這里它將框架常量struts.objectFactory覆蓋了,設(shè)置為”spring”,其實這里是使用了縮寫,我們可以寫全稱:org.apache.struts2.spring.StrutsSpringObjectFactory。這個縮寫的”spring”是和bean配置中的name屬性相對應(yīng)的。默認情況下所有由框架創(chuàng)建的對象都是由ObjectFactory實例化的,ObjectFactory提供了與其它IoC容器如SpringPico等集成的方法。覆蓋這個ObjectFactory的類必須繼承ObjectFactory類或者它的任何子類,并且要帶有一個不帶參數(shù)的構(gòu)造方法。在這里我們用org.apache.struts2.spring.StrutsSpringObjectFactory代替了默認的ObjectFactory

    此外,上面我們說了,如果action不是使用Spring ObjectFactory創(chuàng)建的話,插件提供了兩個攔截器來自動裝配action,默認情況下框架使用的自動裝配策略是name,也就是說框架會去Spring中尋找與action屬性名字相同的bean,可選的裝配策略還有:typeautoconstructor,我們可以通過常量struts.objectFactory.spring.autoWire來進行設(shè)置。

    這樣的話,我們就可以在Action中使用Spring IOC中注入的Bean了。其實這是webwork早有的擴展包里的功能。呵呵。換成strut2.0了還是得說一下。

    有了上面的配置文件我們就可以把Spring2.0 struts2.0 結(jié)合起來了。

    看看IBatis 的配置文件:

    <!-- SqlMap setup for iBATIS Database Layer -->

    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

            <property name="configLocation">

                <value>classpath:/sql-map-config.xml</value>

            </property>

            <property name="dataSource" ref="dataSource"/>

     </bean>

    其實配置這個sqlMapClientSpring中也是眾所周知的事情了。有了ByName的自動裝配功能。我們也不需要在各個DAO中顯示的ref 這個bean 了。

    具體Ibatis的使用請參考 Ibatis官方網(wǎng)站:http://ibatis.apache.org

    from:http://m.tkk7.com/anwenhao/archive/2007/12/29/171610.html

     


    Tags: struts2  struts  ibatis  總結(jié)  spring2  

    原創(chuàng)文章如轉(zhuǎn)載,請注明:轉(zhuǎn)載自:
    飛揚部落編程倉庫 : http://www.busfly.cn/csdn/

    本文鏈接地址:http://www.busfly.cn/csdn/post/Sping2-Struts2-Ibatis,.html

    posted on 2009-09-29 10:14 super_nini 閱讀(446) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿

    隨筆檔案

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 最新国产成人亚洲精品影院| 精品亚洲综合久久中文字幕| 亚洲综合网美国十次| 久久精品免费视频观看| 国产精品亚洲成在人线| 在线涩涩免费观看国产精品| 亚洲精品乱码久久久久66| 在线看片免费人成视频福利| 亚洲色四在线视频观看| 24小时日本电影免费看| 亚洲激情视频图片| 女人张腿给男人桶视频免费版| 日韩免费视频一区| 日韩欧美亚洲中文乱码| 免费在线观看中文字幕| 成人片黄网站色大片免费观看cn| 亚洲一区二区三区影院| 久久久亚洲精华液精华液精华液| 国产免费av片在线无码免费看| 国产精品亚洲一区二区无码| 国产精品免费网站| 亚洲一线产区二线产区区| 国内少妇偷人精品视频免费| 亚洲一区二区影院| 成年美女黄网站18禁免费| 久久精品国产亚洲av高清漫画| 久久久久久国产精品免费免费男同 | 亚洲AV无码成人网站久久精品大 | 在线成人爽a毛片免费软件| www国产亚洲精品久久久日本| 污网站在线免费观看| 亚洲精品你懂的在线观看| 亚洲啪啪免费视频| 日韩欧美亚洲中文乱码| 亚洲国产精华液网站w| 国产精品视频永久免费播放| 亚洲第一永久在线观看| 日本午夜免费福利视频| 久久免费精品视频| 亚洲一区二区三区写真 | 亚洲精品国产肉丝袜久久|