• Spring管理事务配置的五种方式


    spring配置文件中关于事务配置总是由三个组成部分,DataSource、TransactionManager和代理机制这三部分,无论是那种配置方法,一般变化的只是代理机制这块!

    首先我创建了两个类,一个接口类一个实现类:

    package com.dao;  
    public interface UserDao {  
        public void getUser();    
    }  
    package com.dao.impl;  
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
    import com.dao.UserDao;  
    public class UserDaoImpl extends HibernateDaoSupport implements UserDao {  
        public void getUser(){        
        }     
    }  

    第一种:每个Bean都有一个代理:

     1 <?xml version="1.0" encoding="UTF-8"?>  
     2 <beans xmlns="http://www.springframework.org/schema/beans"  
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     4     xmlns:aop="http://www.springframework.org/schema/aop"  
     5     xmlns:tx="http://www.springframework.org/schema/tx"  
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
     7            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
     8            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
     9     <!-- 数据源 -->  
    10     <bean id="dataSource"  
    11         class="org.apache.commons.dbcp.BasicDataSource"  
    12         destroy-method="close">  
    13         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    14         <property name="url"  
    15             value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />  
    16         <property name="username" value="root" />  
    17         <property name="password" value="root" />  
    18         <!-- 连接池启动时的初始值 -->  
    19         <property name="initialSize" value="10" />  
    20         <!-- 连接池的最大值 -->  
    21         <property name="maxActive" value="10" />  
    22         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
    23         <property name="maxIdle" value="20" />  
    24         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
    25         <property name="minIdle" value="10" />  
    26         <property name="defaultAutoCommit" value="true" />  
    27     </bean>  
    28     <!-- 会话工厂 -->  
    29     <bean id="sessionFactory"  
    30         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    31         <property name="dataSource" ref="dataSource" />  
    32         <property name="mappingLocations">  
    33             <list>  
    34                 <value>classpath:/com/nms/entity/**/*.hbm.xml</value>  
    35             </list>  
    36         </property>  
    37         <property name="hibernateProperties">  
    38             <props>  
    39                 <prop key="hibernate.dialect">  
    40                     org.hibernate.dialect.MySQL5Dialect  
    41                 </prop>  
    42                 <prop key="hibernate.show_sql">true</prop>  
    43                 <prop key="hibernate.format_sql">true</prop>  
    44             </props>  
    45         </property>  
    46     </bean>      
    47     <!-- 定义事务管理器 -->    
    48     <bean id="transactionManager"  
    49         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    50         <property name="sessionFactory" ref="sessionFactory" />  
    51     </bean>      
    52     <!-- 配置服务层 -->  
    53     <bean id="userDaoAgency" class="com.dao.impl.UserDaoImpl">  
    54         <property name="sessionFactory" ref="sessionFactory" />  
    55     </bean>      
    56     <bean id="userDao"    
    57         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">    
    58         <!-- 配置事务管理器 -->    
    59         <property name="transactionManager" ref="transactionManager" />       
    60         <property name="target" ref="userDaoAgency" />    
    61         <property name="proxyInterfaces" value="com.dao.UserDao" />  
    62         <!-- 配置事务属性 -->    
    63         <property name="transactionAttributes">    
    64             <props>    
    65                 <prop key="*">PROPAGATION_REQUIRED</prop>  
    66             </props>    
    67         </property>    
    68     </bean>  
    69 </beans>  

    第二种:所有Bean共享一个代理:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
     3            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
     4            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
     5 <!-- 数据源 -->
     6 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     7 <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
     8 <property name="url" value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"/>
     9 <property name="username" value="root"/>
    10 <property name="password" value="root"/>
    11 <!-- 连接池启动时的初始值 -->
    12 <property name="initialSize" value="10"/>
    13 <!-- 连接池的最大值 -->
    14 <property name="maxActive" value="10"/>
    15 <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
    16 <property name="maxIdle" value="20"/>
    17 <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
    18 <property name="minIdle" value="10"/>
    19 <property name="defaultAutoCommit" value="true"/>
    20 </bean>
    21 <!-- 会话工厂 -->
    22 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    23 <property name="dataSource" ref="dataSource"/>
    24 <property name="mappingLocations">
    25 <list>
    26 <value>classpath:/com/nms/entity/**/*.hbm.xml</value>
    27 </list>
    28 </property>
    29 <property name="hibernateProperties">
    30 <props>
    31 <prop key="hibernate.dialect">  
    32                     org.hibernate.dialect.MySQL5Dialect  
    33                 </prop>
    34 <prop key="hibernate.show_sql">true</prop>
    35 <prop key="hibernate.format_sql">true</prop>
    36 </props>
    37 </property>
    38 </bean>
    39 <!-- 定义事务管理器 -->
    40 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    41 <property name="sessionFactory" ref="sessionFactory"/>
    42 </bean>
    43 <!-- 定义事务 -->
    44 <bean id="base" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">
    45 <!-- 配置事务管理器 -->
    46 <property name="transactionManager" ref="transactionManager"/>
    47 <!-- 配置事务属性 -->
    48 <property name="transactionAttributes">
    49 <props>
    50 <prop key="*">PROPAGATION_REQUIRED</prop>
    51 </props>
    52 </property>
    53 </bean>
    54 <!-- 配置服务层 -->
    55 <bean id="userDao" class="com.dao.impl.UserDaoImpl">
    56 <property name="sessionFactory" ref="sessionFactory"/>
    57 </bean>
    58 <!-- 代理对象 -->
    59 <bean id="userDaoAgency" parent="base">
    60 <property name="target" ref="userDao"/>
    61 </bean>
    62 </beans>

    第三种:拦截器:

     1 <?xml version="1.0" encoding="UTF-8"?>  
     2 <beans xmlns="http://www.springframework.org/schema/beans"  
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     4     xmlns:aop="http://www.springframework.org/schema/aop"  
     5     xmlns:tx="http://www.springframework.org/schema/tx"  
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
     7            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
     8            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
     9     <!-- 数据源 -->  
    10     <bean id="dataSource"  
    11         class="org.apache.commons.dbcp.BasicDataSource"  
    12         destroy-method="close">  
    13         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    14         <property name="url"  
    15             value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />  
    16         <property name="username" value="root" />  
    17         <property name="password" value="root" />  
    18         <!-- 连接池启动时的初始值 -->  
    19         <property name="initialSize" value="10" />  
    20         <!-- 连接池的最大值 -->  
    21         <property name="maxActive" value="10" />  
    22         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
    23         <property name="maxIdle" value="20" />  
    24         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
    25         <property name="minIdle" value="10" />  
    26         <property name="defaultAutoCommit" value="true" />  
    27     </bean>  
    28     <!-- 会话工厂 -->  
    29     <bean id="sessionFactory"  
    30         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    31         <property name="dataSource" ref="dataSource" />  
    32         <property name="mappingLocations">  
    33             <list>  
    34                 <value>classpath:/com/nms/entity/**/*.hbm.xml</value>  
    35             </list>  
    36         </property>  
    37         <property name="hibernateProperties">  
    38             <props>  
    39                 <prop key="hibernate.dialect">  
    40                     org.hibernate.dialect.MySQL5Dialect  
    41                 </prop>  
    42                 <prop key="hibernate.show_sql">true</prop>  
    43                 <prop key="hibernate.format_sql">true</prop>  
    44             </props>  
    45         </property>  
    46     </bean>      
    47      <!-- 定义事务管理器(声明式的事务) -->    
    48     <bean id="transactionManager"  
    49         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    50         <property name="sessionFactory" ref="sessionFactory" />  
    51     </bean>     
    52      <!-- 定义事务 -->   
    53     <bean id="transactionInterceptor"    
    54         class="org.springframework.transaction.interceptor.TransactionInterceptor">    
    55         <property name="transactionManager" ref="transactionManager" />    
    56         <!-- 配置事务属性 -->    
    57         <property name="transactionAttributes">    
    58             <props>    
    59                 <prop key="*">PROPAGATION_REQUIRED</prop>    
    60             </props>    
    61         </property>    
    62     </bean>        
    63     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    
    64         <property name="beanNames">    
    65             <list>    
    66                 <value>*DaoImpl</value>  
    67             </list>    
    68         </property>    
    69         <property name="interceptorNames">    
    70             <list>    
    71                 <value>transactionInterceptor</value>    
    72             </list>    
    73         </property>    
    74     </bean>    
    75     <!-- 配置服务层 -->  
    76     <bean id="userDaoAgency" class="com.dao.impl.UserDaoImpl">  
    77         <property name="sessionFactory" ref="sessionFactory" />  
    78     </bean>  
    79 </beans>  

    第四种:使用tx标签配置的拦截器:

     1 <?xml version="1.0" encoding="UTF-8"?>  
     2 <beans xmlns="http://www.springframework.org/schema/beans"  
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     4     xmlns:context="http://www.springframework.org/schema/context"  
     5     xmlns:aop="http://www.springframework.org/schema/aop"  
     6     xmlns:tx="http://www.springframework.org/schema/tx"  
     7     xsi:schemaLocation="http://www.springframework.org/schema/beans   
     8            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
     9            http://www.springframework.org/schema/context  
    10            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
    11            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
    12            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
    13     <!-- 数据源 -->  
    14     <bean id="dataSource"  
    15         class="org.apache.commons.dbcp.BasicDataSource"  
    16         destroy-method="close">  
    17         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    18         <property name="url"  
    19             value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />  
    20         <property name="username" value="root" />  
    21         <property name="password" value="root" />  
    22         <!-- 连接池启动时的初始值 -->  
    23         <property name="initialSize" value="10" />  
    24         <!-- 连接池的最大值 -->  
    25         <property name="maxActive" value="10" />  
    26         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
    27         <property name="maxIdle" value="20" />  
    28         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
    29         <property name="minIdle" value="10" />  
    30         <property name="defaultAutoCommit" value="true" />  
    31     </bean>  
    32     <!-- 会话工厂 -->  
    33     <bean id="sessionFactory"  
    34         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    35         <property name="dataSource" ref="dataSource" />  
    36         <property name="mappingLocations">  
    37             <list>  
    38                 <value>classpath:/com/nms/entity/**/*.hbm.xml</value>  
    39             </list>  
    40         </property>  
    41         <property name="hibernateProperties">  
    42             <props>  
    43                 <prop key="hibernate.dialect">  
    44                     org.hibernate.dialect.MySQL5Dialect  
    45                 </prop>  
    46                 <prop key="hibernate.show_sql">true</prop>  
    47                 <prop key="hibernate.format_sql">true</prop>  
    48             </props>  
    49         </property>  
    50     </bean>  
    51     <context:annotation-config />  
    52     <context:component-scan base-package="com.dao" />  
    53     <!-- 定义事务管理器 -->    
    54     <bean id="transactionManager"  
    55         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    56         <property name="sessionFactory" ref="sessionFactory" />  
    57     </bean>  
    58     <!-- 定义事务 -->  
    59     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
    60         <tx:attributes>  
    61             <tx:method name="*" propagation="REQUIRED" />  
    62         </tx:attributes>  
    63     </tx:advice>  
    64     <!-- 定义切面 -->  
    65     <aop:config>  
    66         <aop:pointcut id="interceptorPointCuts" expression="execution(* com.dao.*.*(..))" />  
    67         <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />  
    68     </aop:config>  
    69 </beans>

    第五种:注解:

     1 <?xml version="1.0" encoding="UTF-8"?>  
     2 <beans xmlns="http://www.springframework.org/schema/beans"  
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     4     xmlns:context="http://www.springframework.org/schema/context"  
     5     xmlns:aop="http://www.springframework.org/schema/aop"  
     6     xmlns:tx="http://www.springframework.org/schema/tx"  
     7     xsi:schemaLocation="http://www.springframework.org/schema/beans   
     8            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
     9            http://www.springframework.org/schema/context  
    10            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
    11            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
    12            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
    13     <!-- 数据源 -->  
    14     <bean id="dataSource"  
    15         class="org.apache.commons.dbcp.BasicDataSource"  
    16         destroy-method="close">  
    17         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    18         <property name="url"  
    19             value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />  
    20         <property name="username" value="root" />  
    21         <property name="password" value="root" />  
    22         <!-- 连接池启动时的初始值 -->  
    23         <property name="initialSize" value="10" />  
    24         <!-- 连接池的最大值 -->  
    25         <property name="maxActive" value="10" />  
    26         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
    27         <property name="maxIdle" value="20" />  
    28         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
    29         <property name="minIdle" value="10" />  
    30         <property name="defaultAutoCommit" value="true" />  
    31     </bean>  
    32     <!-- 会话工厂 -->  
    33     <bean id="sessionFactory"  
    34         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    35         <property name="dataSource" ref="dataSource" />  
    36         <property name="mappingLocations">  
    37             <list>  
    38                 <value>classpath:/com/nms/entity/**/*.hbm.xml</value>  
    39             </list>  
    40         </property>  
    41         <property name="hibernateProperties">  
    42             <props>  
    43                 <prop key="hibernate.dialect">  
    44                     org.hibernate.dialect.MySQL5Dialect  
    45                 </prop>  
    46                 <prop key="hibernate.show_sql">true</prop>  
    47                 <prop key="hibernate.format_sql">true</prop>  
    48             </props>  
    49         </property>  
    50     </bean>  
    51     <context:annotation-config />  
    52     <!-- 使用注解的包路径 -->  
    53     <context:component-scan base-package="com.dao" />  
    54     <!-- 支持  @Transactional 标记 -->  
    55     <tx:annotation-driven transaction-manager="transactionManager"/>  
    56     <!-- 定义事务管理器 -->    
    57     <bean id="transactionManager"  
    58         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    59         <property name="sessionFactory" ref="sessionFactory" />  
    60     </bean>  
    61 </beans>  

    如果使用了注解,那么实现类应该这样写:

     1 package com.dao.impl;  
     2 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
     3 import org.springframework.stereotype.Component;  
     4 import org.springframework.transaction.annotation.Transactional;  
     5 import com.dao.UserDao;  
     6 @Transactional  
     7 @Component("userDaoAgency")  
     8 public class UserDaoImpl extends HibernateDaoSupport implements UserDao {  
     9     /** 
    10      * 为方法增加事务处理特性 
    11      */  
    12     @Transactional(readOnly=true)  
    13     public void getUser(){        
    14     }     
    15 }  

    这样每个方法都能自己定义自己的事务处理!

    转自:http://www.iteye.com/topic/1123347

  • 相关阅读:
    web学习---html,js,php,mysql一个动态网页获取流程
    用正则表达式做替换
    Array.prototype.slice.call(arguments)
    javascript join以及slice,push函数
    SQLServer中跨服务器跨数据库之间的数据操作
    SQL Server里面如何导出包含数据的SQL脚本
    Sql Server 常用日期格式
    Microsoft SQL Server下的SQL语句
    多线程与UI操作(二)
    多线程与UI操作(一)
  • 原文地址:https://www.cnblogs.com/IamXiaoJuRen/p/6627944.html
Copyright © 2020-2023  润新知