Spring声明式事务

常用的SSH框架中,Spring往往配置HibernateTemplate和JdbcTemplate两种事务管理器,

1、配置好数据源;注入Dao和事务管理器
sessionFactory  注入 DAO
DAO注入Service
Service的代理对象注入action
Service的实现类,是service代理对象中的一个字段。

声明式事务组成:事务管理器  注入 事务通知,事务通知和切面联合组成声明式事务。


------------以下内容摘自百度文库---------------------
spring声明式事务总结

初学spring,笔记总结:
1:针对某个类的,可以用代理类方式管理事务:

<!-- 下面是进行声明式事务管理的一个方法:代理类 -->

<!-- 

说明,通过设置代理类来管理事务,要指明目标类是什么,代理目标类设为true 
 
(1)代理类管理事务,需要 aopalliance.jar 和 cglib*.jar
 

(2)代理类可以设置在DAO类上,也可以设置在service层的类上,看需求

(3)代理类设置后,就是目标类的子类,调用目标类的bean时,需要调用代理类的bean

,具体看本程序理解 

如:如果代理类代理DAO类,则 messageSvc 的属性 messageDao 的 ref 应 messageDaoProxy

 (4)事务管理中,若发生运行期异常:RuntimeException() 则抛异常,且回滚,不写入数

据库,若发生普通异常,Exception()则抛异常,不会回滚,依然写入数据库

-->

<bean id="messageSvcProxy" class="org.springframework.transaction.interceptor.TransactionPro

xyFactoryBean">

<property name="transactionManager" ref="transactionManager"></property>

<property name="target">

  <ref local="messageSvc" />

</property>
<property name="proxyTargetClass" value="true"></property>

<property name="transactionAttributes">
<props>
   <prop key="do*">PROPAGATION_REQUIRED</prop>
   <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean> 

2. 针对多个类,可使用AOP方式管理事务

<!-- 

下面使用声明式事务管理另一方法:AOP的方式,上述方法只能管理一个类,此方法

可以批量管理事务

注意:需要加入 aspectJ 文件夹下的两个 jar包

 -->

<!-- 

配置事务的传播特性

 -->

<tx:advice id="txAdvice" transaction-manager="transactionManager">

 <tx:attributes>

  <tx:method name="do*" propagation="REQUIRED" />

  <tx:method name="*" read-only="true" />

 </tx:attributes>

</tx:advice>

<!-- 
哪些类的哪些方法参与事务
 -->

<aop:config>

 <aop:pointcut id="allManagerMethod"
    expression="execution(* com.guo.dao.*.*(..))" />

<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />

</aop:config>

3.声明式事务管理第三种方法:拦截器
<!-- 
声明式事务管理的第三种方法:拦截器
 -->

<bean id="transactionInterceptor"  class="org.springframework.transaction.interceptor.TransactionInterceptor">

  <property name="transactionManager" ref="transactionManager" />
<!-- 
配置事务属性
 -->
<property name="transactionAttributes">

<props>

    <prop key="do*">PROPAGATION_REQUIRED</prop>
   <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
 </props>
</property>

</bean>

<bean  class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<property name="beanNames">

<list>
<value>*Dao</value>
</list>
</property>      

<property name="interceptorNames">

<list>
 <value>transactionInterceptor</value>
</list>
</property>

</bean>
    

 

此外还有:

annotation

全标签方式,参见另一个

word

文件,或网址:



http://lvqionghua.blog.163.com/blog/static/1852774201152234023736

/

 

4.

表达式描述

 

* com.guo.dao.*.*(..)

:第一个

*

表示任何返回值,第二个

*

表示任何类,第三个

*

表示任

何方法:见下描述

 

除了返回类型模式(上面代码片断中的

ret-type-pattern

),名字模式和参数模式以外,所有的部分都是可

选的。



返回类型模式决定了方法的返回类型必须依次匹配一个连接点。



你会使用的最频繁的返回类型模

式是



*



,它代表了匹配任意的返回类型。



一个全称限定的类型名将只会匹配返回给定类型的方法。名字

模式匹配的是方法名





你可以使用



*



通配符作为所有或者部分命名模式





参数模式稍微有点复杂



()





配了一个不接受任何参数的方法,







(..)



匹配了一个接受任意数量参数的方法(零或者更多)。









(*)



匹配了一个接受一个任何类型的参数的方法。



模式



(*,String)



匹配了一个接受两个参数的

方法,第一个可以是任意类型,第二个则必须是

String

类型。



下面给出一些常见切入点表达式的例子。

 





任意公共方法的执行:

 

execution(public * *(..)) 





任何一个以

“set”

开始的方法的执行:

 

execution(* set*(..)) 





AccountService



接口的任意方法的执行:

 

execution(* com.xyz.service.AccountService.*(..)) 





定义在

service

包里的任意方法的执行:

 

execution(* com.xyz.service.*.*(..)) 





定义在

service

包或者子包里的任意方法的执行:

 

execution(* com.xyz.service..*.*(..)) 



 

5.

注意:

 

运行期异常会发生回滚,普通异常不会回滚,仍可写入数据库



猜你喜欢

转载自451640893.iteye.com/blog/2390172