springMVC+mybatis事务管理配置

    xiaoxiao2021-04-12  38

    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>  
    转载请注明原文地址: https://ju.6miu.com/read-667423.html

    最新回复(0)