`

spring的事物配置方式

阅读更多

 

根据代理机制不同,有以下几种配置方式:(推荐使用第四种方式,做spring的事物)

 

首先定义一个接口和实现类,并在此基础上进行配置---

Java代码  

收藏代码

public interface IUserDao {  
 public void insertUser(UserTable user);  
}  
 
 

Java代码  

收藏代码

public class UserDaoImpl extends HibernateDaoSupport implements IUserDao{  
    public void insertUser(UserTable user) {  
        getHibernateTemplate().saveOrUpdate(user);  
    }  
}  
 
 

 

  • 第一种:每个bean设置一个代理,这种是根据具体需求来定,如要对具体到每个交易进行事务操作的话,这个方式是最合适的

 

<!-- 每个bean都有一个代理 -->  

<beans>  
    <!-- sessionFactory相当于spring datasource -->  
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
    </bean>    
    <!-- 定义事务管理器(声明式的事务) -->    
    <bean id="transactionManager"  
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
      
    <!-- 配置DAO -->  
    <bean id="userDao" class="org.lgh.spring.transaction2.UserDaoImpl">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
    <!-- 每个bean都有一个代理 <property name="target" ref="userDaoTarget" />  -->  
    <bean id="userDaoProxy"    
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">    
           <!-- 配置事务管理器 -->    
           <property name="transactionManager" ref="transactionManager" />       
        <property name="target" ref="userDao" />    
         <property name="proxyInterfaces" value="org.lgh.spring.transaction2.IUserDao" />  
        <!-- 配置事务属性 -->    
        <property name="transactionAttributes">    
            <props>    
                <prop key="*">PROPAGATION_REQUIRED</prop>  
            </props>    
        </property>    
    </bean>    
</beans>  
 

 

  • 第二种:所有的bean共享一个代理

 

 <!-- 所有的bean共享一个代理-->  
<beans>  
    <bean id="sessionFactory"    
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
    </bean>    
    <!-- 定义事务管理器(声明式的事务) -->    
    <bean id="transactionManager"  
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
    <!-- 所有的bean共享一个代理/>  -->  
    <bean id="transactionBase"    
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"    
            lazy-init="true" abstract="true">    
        <!-- 配置事务管理器 -->    
        <property name="transactionManager" ref="transactionManager" />    
        <!-- 配置事务属性 -->    
        <property name="transactionAttributes">    
            <props>    
                <prop key="*">PROPAGATION_REQUIRED</prop>    
            </props>    
        </property>    
    </bean>      
    <!-- 配置DAO -->  
    <bean id="userDao" class="org.lgh.spring.transaction3.UserDaoImpl">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
     <!-- 所有的bean共享一个代理/>  -->  
    <bean id="userDaoProxy" parent="transactionBase" >    
        <property name="target" ref="userDao" />     
    </bean>  
</beans>  
 

 

  • 第三种:使用拦截器 来配置你的事务,这个主要是进行一些方法调用前后进行一些其他事件的处理,如进行权限检查等...

 

<!-- 使用拦截器 -->  
  
<beans>  
    <bean id="sessionFactory"    
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
    </bean>    
    <!-- 定义事务管理器(声明式的事务) -->    
    <bean id="transactionManager"  
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>   
    <bean id="transactionInterceptor"    
        class="org.springframework.transaction.interceptor.TransactionInterceptor">    
        <property name="transactionManager" ref="transactionManager" />    
        <!-- 配置事务属性 -->    
        <property name="transactionAttributes">    
            <props>    
                <prop key="*">PROPAGATION_REQUIRED</prop>    
            </props>    
        </property>    
    </bean>  
    <bean name="logger" class="org.lgh.spring.transaction4.SpringAOPInterceptor">  
    </bean>  
    <bean id="logBeforeAdvice" class="com.spring.advices.LogBeforeAdvice">  
    </bean>  
    <!-- 定义BeanNameAutoProxyCreator,该bean是个bean后处理器,无需被引用,因此没有id属性     
    这个bean后处理器,根据事务拦截器为目标bean自动创建事务代理    -->  
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    
        <!-- 加上此句就不会抛出 $Proxy cannot be cast的异常啦-->  
        <property name="proxyTargetClass">  
              <value>true</value>  
        </property>    
        <property name="beanNames">    
            <list>    
            <!-- *Dao对应下面的userDao要对它进行拦截-->  
                <value>userDao</value>  
            </list>    
        </property>    
        <property name="interceptorNames">    
            <list>    
                <value>transactionInterceptor</value>    
                <value>logBeforeAdvice</value>  
            </list>    
        </property>    
    </bean>    
    <!-- 配置DAO -->  
    <bean id="userDao" class="org.lgh.spring.transaction4.UserDaoImpl">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
    <!-- 服务层 service-->  
     <bean id="userService" class="org.lgh.spring.transaction4.UserServiceImpl">  
        <property name="userDao" ref="userDao" />  
    </bean>  
</beans>  
 

 

  • 第四种:使用aop:config配置方式

 

<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context"  
    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.5.xsd  
           http://www.springframework.org/schema/context  
           http://www.springframework.org/schema/context/spring-context-2.5.xsd  
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
 <context:annotation-config />  
    <context:component-scan base-package="org.lgh.spring.transaction5" />  
    <bean id="sessionFactory"    
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
    </bean>    
    <!-- 定义事务管理器(声明式的事务) -->    
    <bean id="transactionManager"  
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </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="REQUIRED" />  
</tx:attributes>  
    </tx:advice>  
    <aop:config   proxy-target-class="true" >  
        <aop:pointcut id="interceptorPointCuts"  
            expression="execution(* org.lgh.spring.transaction5.*.*(..))" />  
        <aop:advisor advice-ref="txAdvice"  
            pointcut-ref="interceptorPointCuts" />          
    </aop:config>       
    <!-- 配置DAO -->  
    <bean id="userDao" class="org.lgh.spring.transaction5.UserDaoImpl">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
</beans>  
 

 

 

execution(* org.lgh.spring.transaction5.*.*(..))中:

第一个 * —— 通配 任意返回值类型|

|第二个 * —— 通配 包org.lgh.spring.transaction5下的任意class|

|第三个 * —— 通配 包org.lgh.spring.transaction5下的任意class的任意方法|

|第四个 .. —— 通配 方法可以有0个或多个参数|

 

  •  第五种:注解方式:

 

<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context"  
    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.5.xsd  
           http://www.springframework.org/schema/context  
           http://www.springframework.org/schema/context/spring-context-2.5.xsd  
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
 <context:annotation-config />  
    <context:component-scan base-package="org.lgh.spring.transaction6" />  
    <tx:annotation-driven proxy-target-class ="true" transaction-manager="transactionManager"/>   
    <bean id="sessionFactory"    
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
    </bean>    
    <!-- 定义事务管理器(声明式的事务) -->    
    <bean id="transactionManager"  
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
    <!-- 配置DAO -->  
    <bean id="userDao" class="org.lgh.spring.transaction6.UserDaoImpl">  
          
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
      
</beans>  
 
分享到:
评论

相关推荐

    Spring 事物配置的方式

    Spring 事务配置的五种方式 ,讲述了Sping 事物配置的全过程

    spring中事物配置

    Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。本篇将重点讲解如何利用AOP(面向切面编程)进行声明式事务配置。 首先,我们需要理解AOP在Spring中的作用。AOP是一种设计模式,它允许我们在不...

    Spring事物配置的五种模式

    这种方式是最常用的事务配置方式,通过在Java代码中使用`@Transactional`注解来标记事务边界。这种方式的优点在于配置简单,同时也非常直观。 **配置示例**: ```java @Service public class UserService { @...

    spring的5中事物配置 介绍spring的5中事物配置

    Spring 框架提供了多种事务配置方式,这些配置方法主要基于Spring的AOP(面向切面编程)来实现事务管理。下面将详细介绍Spring中的五种事务配置方式。 1. **基于代理的事务管理(Proxy-based Transaction Management...

    spring事物管理配置的5种方式

    在Spring框架中,事务管理是核心功能之一,它确保了数据操作的...综上所述,Spring提供了灵活多样的事务管理配置方式,可以根据项目需求选择适合的方案。理解并熟练运用这些配置,将有助于提升应用的稳定性和可维护性。

    spring配置事物的5种方式

    在Spring框架中,事务管理是...总结来说,Spring提供多种事务配置方式,可以根据项目需求和团队偏好选择合适的方式。理解这些配置方式的核心原理,能够帮助我们更好地管理和控制事务,从而提高应用的稳定性和可靠性。

    spring事物和rabbitMQ的例子

    Spring提供了一种声明式事务管理方式,使得开发者可以在不直接编写事务控制代码的情况下,通过配置来管理事务的边界。在"spring的2个数据源的配置"中,这意味着系统可能需要处理来自两个不同数据源的数据,例如一个...

    Spring声明式事务配置模板2.x

    Spring 2.x版本的声明式事务配置模板是开发者常用的一种方式,它通过AOP(面向切面编程)实现事务的自动管理,使得开发者无需在业务代码中显式调用事务开始、提交或回滚等操作。下面我们将详细探讨Spring 2.x的声明...

    spring 整合hibernate的事物配置.pdf

    spring 整合hibernate的事物配置

    spring配置方法

    spring 配置方法,xml文件,爱好ssh框架的通知们来把,spring配置事物管理,配置数据源

    spring事物的五种配制方法

    这种配置方式中,每一个业务逻辑Bean都会有自己的代理对象。这种方式下,每个DAO或Service Bean都通过`TransactionProxyFactoryBean`来配置事务。 **示例代码**: ```xml &lt;bean id="sessionFactory" class="org....

    spring分布式事务配置详解附源码

    spring分布式配置详解,并有testng测试报告, 公司封了端口,下载后,把后缀名改为rar就行了

    spring的事务管理配置

    spring的事务管理配置详解.txt详细的描述了如何配置spring的事物。

    事物简单总结(偏向Spring事物)

    另外,Spring还支持Java配置方式,通过@Configuration和@EnableTransactionManagement注解来启用事务管理。 Spring事务的传播行为定义了在调用一个方法时如何处理当前事务。例如,PROPAGATION_REQUIRED表示如果存在...

    Spring事务管理Demo

    2. **声明式事务管理**:这是Spring最常用的方式,通过在配置文件或者使用`@Transactional`注解来定义事务边界,使得事务管理与业务逻辑分离,降低了代码的耦合度。`@Transactional`注解可以应用于方法级别,表示该...

    事物管理配置文件.txt

    标题:事物管理配置文件 描述:本篇详细解析了在SSH(Struts+Spring+Hibernate)框架整合过程中,Spring配置事务管理的具体实现方法。通过深入分析XML配置文件中的bean定义,我们将逐步理解如何通过Spring来管理和...

    spirn的事物配置详解与webservices案例

    1. Spring事物配置详解: 在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式来管理事务。声明式事务管理通过在XML配置文件或注解中定义事务边界,使得事务处理更加简洁。例如,可以使用...

    第十四章 Spring4 切面事物与事物通知与传播行为

    Spring4提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地管理事务开始、提交和回滚,而声明式事务管理则通过在配置或注解中声明事务规则,更加灵活且易于维护。例如,...

    spring事物管理

    这是最传统的配置方式,通过`&lt;tx:annotation-driven&gt;`或`&lt;tx:advice&gt;`标签来定义事务。在示例代码中,`是一个事务代理工厂,它创建了一个共享的事务代理,所有与`transactionBase`关联的bean(例如`userDaoProxy`)...

    spring 事务(6中配置完全降解)

    Spring支持通过XML配置来管理事务,这是最基础的配置方式。在`spring`的配置文件中,我们可以定义`&lt;tx:annotation-driven&gt;`或`&lt;tx:advice&gt;`元素来启用事务管理。`&lt;tx:annotation-driven&gt;`主要用于处理类或方法上的@...

Global site tag (gtag.js) - Google Analytics