spring tx:advice和aop:config配置事務 – JAVA編程語言程序開發技術文章

<?xml version="1.0" encoding="UTF-8"?> 
 
<beans xmlns="https://www.springframework.org/schema/beans" 
    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="https://www.springframework.org/schema/aop" 
    xmlns:tx="https://www.springframework.org/schema/tx" 
    xmlns:context="https://www.springframework.org/schema/context" 
    xsi:schemaLocation="https://www.springframework.org/schema/beans 
                     https://www.springframework.org/schema/beans/spring-beans.xsd 
                     https://www.springframework.org/schema/tx 
                     https://www.springframework.org/schema/tx/spring-tx.xsd 
                     https://www.springframework.org/schema/aop 
                     https://www.springframework.org/schema/aop/spring-aop.xsd " 

 
<bean id="transactionManager" 
        class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
        abstract="false" lazy-init="default" autowire="default" 
        dependency-check="default"> 
        <property name="sessionFactory"> 
            <ref bean="sessionFactory" /> 
        </property> 
    </bean> 
    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
        <tx:attributes> 
            <tx:method name="add*" propagation="REQUIRED" /> 
            <tx:method name="delete*" propagation="REQUIRED" /> 
            <tx:method name="update*" propagation="REQUIRED" /> 
            <tx:method name="add*" propagation="REQUIRED" /> 
            <!– <tx:method name="*" propagation="true" />–> 
        </tx:attributes> 
 
    </tx:advice> 
 
    <aop:config> 
        <aop:pointcut id="allManagerMethod" 
            expression="execution(* com.service.*.*(..))" /> 
        <aop:advisor advice-ref="txAdvice" 
            pointcut-ref="allManagerMethod" /> 
    </aop:config> 
</beans> 

Eclipse不能識別<tx:advice/>標簽

在開發Spring的過程中,有時會出現Eclipse不能識別<tx:advice/>標簽。

提示出現以下錯誤:

The prefix "tx" for element "tx:advice" is not bound

 

這個錯誤的原因很簡單是:

我們在定義申明AOP的時候。。沒有加載schema。

具體表現如下:
Xml代碼 
<beans> 
 
<tx:advice id="txAdvice" transaction-manager="transactionManager">  
     <tx:attributes>  
         <tx:method name="get*" read-only="true"/>  
         <tx:method name="*" propagation="REQUIRES_NEW" rollback-for="Exception"/>  
     </tx:attributes>  
</tx:advice> 
 
<!– aop代理設置–>  
<aop:config proxy-target-class="true">    
…. 
 
</aop:config> 
 
</beans> 

這時會拋出異常不認<TX>標簽。。起先還以為是沒有加載JAR包呢。。

後來讀AOP文檔才發現<beans>中要加入“xmlns:aop”的命名申明,並在“xsi:schemaLocation”中指定aop配置的schema的地址

配置文件如下:
Xml代碼 
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="https://www.springframework.org/schema/beans " 
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance " 
xmlns:aop="https://www.springframework.org/schema/aop " 
xmlns:tx="https://www.springframework.org/schema/tx " 
xsi:schemaLocation="https://www.springframework.org/schema/beans 
                     https://www.springframework.org/schema/beans/spring-beans.xsd 
                     https://www.springframework.org/schema/tx 
                     https://www.springframework.org/schema/tx/spring-tx.xsd 
                     https://www.springframework.org/schema/aop 
                     https://www.springframework.org/schema/aop/spring-aop.xsd "> 

這些才是最關鍵的地方。。後面的配置不變。。。。

Spring使用 <tx:advice>和 <aop:config> 用來配置事務,具體如何配置你可以參考Spring文檔。

 

綜上:包com.evan.crm.service下的任意class的具有任意返回值類型、任意數目參數和任意名稱的方法
<tx:advice/> 有關的設置

這一節裡將描述通過 <tx:advice/> 標簽來指定不同的事務性設置。默認的 <tx:advice/> 設置如下:

事務傳播設置是 REQUIRED

隔離級別是 DEFAULT

事務是 讀/寫

事務超時默認是依賴於事務系統的,或者事務超時沒有被支持。

任何 RuntimeException 將觸發事務回滾,但是任何 checked Exception 將不觸發事務回滾

這些默認的設置當然也是可以被改變的。 <tx:advice/> 和 <tx:attributes/> 標簽裡的 <tx:method/> 各種屬性設置總結如下:
表 9.1. <tx:method/> 有關的設置

屬性 是否需要? 默認值 描述
name 是   與事務屬性關聯的方法名。通配符(*)可以用來指定一批關聯到相同的事務屬性的方法。 如:'get*'、'handle*'、'on*Event'等等。
propagation 不 REQUIRED 事務傳播行為
isolation 不 DEFAULT 事務隔離級別
timeout 不 -1 事務超時的時間(以秒為單位)
read-only 不 false 事務是否隻讀?
rollback-for 不   將被觸發進行回滾的 Exception(s);以逗號分開。 如:'com.foo.MyBusinessException,ServletException'
no-rollback-for 不   不 被觸發進行回滾的 Exception(s);以逗號分開。 如:'com.foo.MyBusinessException

作者:Tender001

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。