用TransactionProxyFactoryBean实现spring的声明式事务

来源:互联网 发布:数据库三大范式好处 编辑:程序博客网 时间:2024/04/20 08:20

spring对声明式事务是通过它的AOP框架实现的。要在spring中使用声明式事务,需用到TransactionProxyFactoryBean,它类似于ProxyFactoryBean,不过其目的是将方法包装在事务上下文中。

可以创建自己的ProxyFactoryBean来处理事务,也能达到同样的效果,但TransactionProxyFactoryBean是专门为声明式事务设计的,用它会简单些。

网上的一个例子:

Java代码  收藏代码
  1. <bean id="testAction" class="test.action.Stuts2ActionTest">    
  2.     <property name="service" ref="templatesService"></property>    
  3. </bean>    
  4.   
  5. <bean id="templatesService"    
  6.     class="test.service.impl.TaoTemplatesServiceImpl">    
  7.     <property name="dao" ref="templatesDAO" />    
  8. </bean>  

 主要地方:

Java代码  收藏代码
  1. <!--   定义DAO bean的事务代理-->    
  2. <bean id="templatesDAO"    
  3.     class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean ">    
  4.     <!--   为事务代理bean注入事务管理器-->    
  5.     <property name="transactionManager">    
  6.         <ref bean="transactionManager" />    
  7.     </property>    
  8.   
  9.     <!--   设置事务属性-->    
  10.     <property name="transactionAttributes">    
  11.         <props>    
  12.             <!--   所有以add开头的方法,采用required的事务策略,并且只读-->    
  13.             <prop key="add*">PROPAGATION_REQUIRED</prop>    
  14.             <!--   所有以mod开头的方法,采用required的事务策略,并且只读-->    
  15.             <prop key="mod*">PROPAGATION_REQUIRED</prop>    
  16.             <!--   所有以del开头的方法,采用required的事务策略,并且只读-->    
  17.             <prop key="del*">PROPAGATION_REQUIRED</prop>    
  18.             <!--   其他方法,采用required的事务策略 -->    
  19.             <prop key="*">readOnly</prop>    
  20.         </props>    
  21.     </property>   
  22.   
  23.     <!--   为事务代理bean设置目标bean -->    
  24.     <property name="target">    
  25.         <!--   采用嵌套bean配置目标bean-->    
  26.         <bean class="test.dao.impl.TaoTemplatesDAOImpl">    
  27.             <property name="sessionFactory">    
  28.                 <ref local="sessionFactory" />    
  29.             </property>    
  30.         </bean>    
  31.     </property>    
  32. </bean>   
 
Java代码  收藏代码
  1. <!--   定义事务管理器,使用适用于Hibernte的事务管理器-->    
  2.      <bean id="transactionManager"   class="org.springframework.orm.hibernate3.HibernateTransactionManager">    
  3.       <!--   HibernateTransactionManager   bean需要依赖注入一个SessionFactory bean的引用-->    
  4.          <property name="sessionFactory">    
  5.              <ref local="sessionFactory" />    
  6.          </property>    
  7.      </bean>  
 
Java代码  收藏代码
  1. <!--定义数据源-->    
  2. <bean id="dataSource"    
  3.     class="org.apache.commons.dbcp.BasicDataSource">    
  4.     <!--   定义数据库驱动-->    
  5.     <property name="driverClassName">    
  6.         <value>oracle.jdbc.driver.OracleDriver</value>    
  7.     </property>    
  8.     <!--   定义数据库url-->    
  9.     <property name="url">    
  10.         <value>jdbc:oracle:thin:@192.168.1.96:1521:yxdb</value>    
  11.     </property>    
  12.     <!--   定义数据库用户名-->    
  13.     <property name="username">    
  14.         <value>yxuser</value>    
  15.     </property>    
  16.     <!--   定义数据库密码-->    
  17.     <property name="password">    
  18.         <value>yxuser</value>    
  19.     </property>    
  20. </bean>    
  21.   
  22. <!--定义一个hibernate的SessionFactory-->    
  23. <bean id="sessionFactory"    
  24.     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
  25.     <!--   定义SessionFactory必须注入DataSource-->    
  26.     <property name="dataSource">    
  27.         <ref local="dataSource" />    
  28.     </property>    
  29.     <property name="mappingResources">    
  30.         <list>    
  31.             <!--以下用来列出所有的PO映射文件-->    
  32.             <value>test/mapping/Tao_Templates.hbm.xml</value>    
  33.         </list>    
  34.     </property>    
  35.     <property name="hibernateProperties">    
  36.         <props>    
  37.             <prop key="hibernate.dialect">    
  38.                 org.hibernate.dialect.Oracle10gDialect    
  39.             </prop>    
  40.             <prop key="hibernate.show_sql">true</prop>    
  41.             <!--此处用来定义hibernate的SessionFactory的属性:    
  42.                 不同数据库连接,启动时选择create,update,create-drop -->    
  43.             <prop key="hibernate.hbm2ddl.auto">update</prop>    
  44.         </props>    
  45.     </property>    
  46. </bean>   

 《Spring IN Action》例子:


Java代码  收藏代码
  1. <bean id="courseServiceTarget" class="com.test.CourseServiceImpl">  
  2. </bean>  

当Service比较多时,这种方式XML比较庞大,有以下两种解决方式:

1、Bean继承

2、AOP自动代理


Bean继承:

Java代码  收藏代码
  1. <bean id="abstractTxDefinition" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean "  lazy-init="true">  
  2.   
  3.    <property name="transactionManager">  
  4.         <ref bean="transactionManager">  
  5.    </property>  
  6.   
  7.    <property name="transactionAttributeSource">  
  8.          <ref bean="attributeSource">  
  9.    </property>  
  10. </bean>  

 

 

Java代码  收藏代码
  1. <bean id="courseService" parent="abstractTxDefinition">  
  2.     <property name="target">  
  3.         <bean class="com.test.CourceServiceImpl">  
  4.      </property>  
  5. </bean>  
  6.   
  7. //将另一个bean事务化  
  8.   
  9. <bean id="studentService" parent="abstractTxDefinition">  
  10.     <property name="target">  
  11.         <bean class="com.test.StudentServiceImpl">  
  12.      </property>  
  13. </bean>  

 

AOP自动代理:

http://uule.iteye.com/admin/blogs/894055

0 0