springMVC+mybatis事务管理配置

来源:互联网 发布:淘宝优惠券 微信公众号 编辑:程序博客网 时间:2024/06/05 22:39
springMVC+mybatis整合框架的事务管理方式有两种:一种是声明式事务管理策略,另一种是编程式事务管理策略。
编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。


       显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。


         声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。


注解方式主要分为以下五部:


1.applicationContext.xml中,去掉对controller的扫描


  <context:component-scan base-package="com.digitalchina.*">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>


  2.*-servlet.xml中,去掉对 service的扫描,加入对controller的扫描


 <context:component-scan base-package="com.digitalchina.*"> 
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
    </context:component-scan>


  3.事务的配置只有在 applicationContext.xml中才会起作用,即
  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource" />
     </bean>
     必须配置在 applicationContext.xml 中


  4.用事务去控制的service,不能加try catch去捕获异常,否则不能被spring拦截到,事务就失效了。


  5.在Service实现类中增加@Transactional注解即可控制事务。


基于tx和aop名字空间的xml配置,配置如下:
<!-- 事物切面配置 --> 
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
 
<tx:advice id="advice" transaction-manager="transactionManager">  
    <tx:attributes>  
        <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>  
        <tx:method name="insert" propagation="REQUIRED" read-only="false"/>  
    </tx:attributes>  
</tx:advice>  
  
<aop:config>  
    <aop:pointcut id="testService" expression="execution (* com.baobao.service.MyBatisService.*(..))"/>  
    <aop:advisor advice-ref="advice" pointcut-ref="testService"/>  
</aop:config>  


由于springmvc的配置文件与spring的配置文件不是同时加载,如果这边不进行这样的设置,那么,spring就会将所有带@Service注解的类都扫描到容器中,等到加载spring的配置文件的时候,会因为容器已经存在Service类,使得cglib将不对Service进行代理,直接导致的结果就是在spring配置文件中的事务配置不起作用,

所以在spring配置文件中,添加不扫描controler,如下:


<!-- 自动扫描组件,这里要把controler下面的 controller去除,如果不去除会影响事务管理的。   -->  
<context:component-scan base-package="com.weituo">  
     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />   

</context:component-scan>  


在springMVC中,添加不扫描service,如下:


<context:component-scan base-package="com.weituo">  
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />  
</context:component-scan>  
12 0
原创粉丝点击