首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 事務管理與 Web 整合筆記(三):聲明式事務進階、Bean 繼承優化與 Struts/Tapestry/JSF/WebWork 整合

     編輯:Java 相關知識

《Spring in Action》筆記第三部分,涵蓋聲明式事務管理進階配置(自動代理、屬性來源、元數據)、Bean 繼承減少 XML 冗餘、Spring 與主流 Web 框架整合方式對比。

聲明式事務管理進階

自動代理:DefaultAdvisorAutoProxyCreator

無需為每個 Service 手動配置 TransactionProxyFactoryBean,改用自動代理掃描所有 Advisor:

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<bean id="txAdvisor" class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
    <property name="transactionInterceptor">
        <bean class="org.springframework.transaction.interceptor.TransactionInterceptor">
            <property name="transactionManager" ref="txManager"/>
            <property name="transactionAttributeSource">
                <bean class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
                    <property name="properties">
                        <props>
                            <prop key="add*">PROPAGATION_REQUIRED</prop>
                            <prop key="update*">PROPAGATION_REQUIRED</prop>
                            <prop key="delete*">PROPAGATION_REQUIRED</prop>
                            <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
                        </props>
                    </property>
                </bean>
            </property>
        </bean>
    </property>
</bean>

所有 Bean 的方法名匹配模式者自動套用事務,新增 Service 無需修改 XML。

事務屬性來源對比

來源類別特點適用場景
NameMatchTransactionAttributeSource方法名通配符匹配,配置簡單命名規範專案,快速套用
MethodMapTransactionAttributeSource精確指定 類.方法 → 屬性,支援通配符需精細控制特定方法
AttributesTransactionAttributeSourceJDK 1.5+ 註解 (@Transactional) / Commons Attributes現代專案首選,代碼即配置

回滾規則自定義

<prop key="addUser">PROPAGATION_REQUIRED,-MyBusinessException,+RuntimeException</prop>

預設:RuntimeException 及 Error 回滾,checked exception 不回滾(符合 EJB 行為)。

Bean 繼承優化 XML 配置

TransactionProxyFactoryBean 重複屬性極多,抽取父 Bean:

<bean id="baseTxProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
      abstract="true" lazy-init="true">
    <property name="transactionManager" ref="txManager"/>
    <property name="transactionAttributeSource" ref="txAttributeSource"/>
</bean>

<bean id="userService" parent="baseTxProxy">
    <property name="target" ref="userServiceTarget"/>
</bean>
<bean id="orderService" parent="baseTxProxy">
    <property name="target" ref="orderServiceTarget"/>
</bean>

abstract="true" + lazy-init="true" 避免父 Bean 被實例化,子 Bean 僅需指定 target。

Spring 與 Web 框架整合對比

框架整合方式核心類/配置評價
Struts 1.x1. Action 繼承 ActionSupport
2. DelegatingRequestProcessor
ContextLoaderPlugIn, DelegatingActionProxy方式 2 較解耦,但映射 path↔bean name 醜陋
Tapestry自定義 Engine 注入 Spring Context繼承 BaseEngine,setupForRequest() 放入 Global需自行實作整合類,Spring 未內建
JSF變數解析器委派 SpringJSF-Spring 專案 (jsfspring.sourceforge.net)有獨立整合專案,較成熟
WebWork 1.xwebwork.properties 設 ActionFactorySpringActionFactory已停止維護
WebWork 2.x / XWorkxwork.xml 設 externalReferenceResolver + InterceptorSpringServletContextReferenceResolver, ExternalReferenceInterceptor較複雜,WebWork 2 併入 Struts 2

DAO 支援體系總覽

Spring 為各 ORM 提供統一 DaoSupport 基類:

HibernateDaoSupport      // getSession(), closeSessionIfNecessary()
JdbcDaoSupport           // getJdbcTemplate()
JdoDaoSupport
SqlMapClientDaoSupport   // iBatis 2.x
SqlMapDaoSupport         // iBatis 1.3
TopLinkDaoSupport
CciDaoSupport

繼承對應 DaoSupport 即可獲得模板/Session 便利方法,異常自動轉換為 DataAccessException 體系。

關鍵收穫

  • 自動代理 + NameMatchTransactionAttributeSource = 近零配置聲明式事務。
  • Bean 繼承消除大量重複 XML,父 Bean 設 abstract="true" lazy-init="true"。
  • Struts 整合首選 DelegatingRequestProcessor,避免侵入 Action 代碼。
  • 現代專案請直接使用 @Transactional 註解 + <tx:annotation-driven/>,棄用 XML 事務配置。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved