spring声明式事务管理

    spring的事务管理有两种,一种是编程式的事务管理,另外一种是声明式事务管理。编程式事务管理比较灵活,但是代码量大,存在相互重复的代码;声明式事务管理比编程式事务管理更为灵活。

编程式事务管理需要自己手动写代码实现事务的功能。声明式事务管理只需要配置文件的设置即可或者是结合注解共同使用。

本次,我只解析声明式事务管理。并且,本次例子建立在ssh框架之上的应用,如果没有搭建好的,可以参考http://www.cnblogs.com/demoMeng/

一、声明式事务管理(纯spring配置文件)

  1、搭建好相关的ssh框架

  2、配置声明式事务管理的spring的配置文件:applicationContext.xml,具体请参考代码:

    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="mySessionFactory"></property>
    </bean>


<!-- 假定这个tx:advice 标签是springAOP中 handler --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="mod*" propagation="REQUIRED" /> <tx:method name="*" propagation="REQUIRED" read-only="true" /> </tx:attributes> </tx:advice> <!-- 那么下面的aop:config就是springAOP中的target --> <aop:config> <aop:pointcut id="interceptorPointCuts" expression="execution(* dao.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config>

    解析:

    tx:advice假定是handler(代理),这个handler需要引用一个transactionManager(事务管理器)。

    定义一个bean作为事务管理对象,添加一个class属性,值需要为hibernate5.X的版本。

    tx:attributes标签下的子标签有一个tx:method中的name属性是dao中的方法名,一般来说是add(增)delete(删)modify(改)query(查询),查询一般设置只读。这里使用通配符以适应不用的命名规则。propagation设置事务的传播行为,一般设置为默认值REQUIRED。

 

    aop:config下的aop:pointcut标签,顾名思义切面。其中expression设置是哪里需要添加事务管理,也就是AOP中的切面。比如说:开启事务,提交事务,关闭session等这些通用的相同的代码,把他们设置为一个切面。免去重复书写。本例在dao包下的所有方法进行添加事务管理,也就是在dao包所有的类都不需要做开启事务,提交事务,关闭session的事情了,这些事情全部交给transactionManager来做。

最后的aop:advisor标签把tx:advice和aop:pointcut进行连接,实现了声明式事务管理。

 

二、声明式事务管理(配置文件+spring注解)

    1、搭建好相关的ssh框架应用。

    2、编写相关的配置文件:applicationContext.xml  具体请参考如下代码:

    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="mySessionFactory"></property>
    </bean>

     <tx:annotation-driven transaction-manager="transactionManager" /> 

     3、spring注解:

      ⑴、在类上注解:

         

      ⑵、在具体的方法上注解:

          

      注意:这些在类上的注解或者是在方法上的注解都是在调用dao层的实现类上写的,即注解需要写在dao的上一层。本例中service调用了dao层,所以注解是写在service层而不是dao层。

三、纯配置文件和配置文件+注解区别:

    二者的最大的区别就是耦合性的问题。纯配置文件和spring框架的耦合程度低,而配置文件+注解和spring框架的耦合性程度高,但是代码的可读性较高。

      

     

原文地址:https://www.cnblogs.com/demoMeng/p/5983896.html