锁定老帖子 主题:spring声明式事务策略 aop拦截
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-12-13
声明式事务管理: Spring提供了声明式事务管理。是通过Spring AOP实现的。 Spring中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的,spring的在这段时间内通过拦截器,加载事务切片。原理就是这样的,可以参考JDK动态代理实例。 Spring中进行事务控制: 动态代理的一个重要特征是,它是针对接口的,所以我们的DAO要通过动态代理来让spring接管事务,就必须在dao前面抽象出一个接口,当然如果没有这样的接口,那么spring会使用CGLIB来决解问题,但这不是spring推荐的方式。 大多数spring用户选择声明式事务管理。这是最少影响应用代码的选择,因而这是和非侵入性的轻量级容器的观念是一致的。 从考虑EJB CMT和spring声明式事务管理的相似以及不同之处出发是很有益的。他们的基本方法是相似的:都可以指定事务管理到单独的方法;如果需要可以在事务上下文调用setRollbackOnly()方法。不同之处如下: 1、不像EJB CMT绑定在JTA上,spring声明式事务管理可以在任何环境下使用。只需要更改配置文件,它就可以和JDBC、JDO、Hibernate或其他的事务机制一起工作。 2、spring可以使声明式事务管理应用到普通的Java对象,不仅仅是特殊的类,如EJB。 3、spring提供声明式回滚规则:EJB诶呦地域的特征,回滚可以声明式控制,不仅仅是编程式的。 4、spring允许你通过AOP定制事务行为。如:如果需要,可以在事务回滚中插入定制的行为。也可以增加任意的通知,就像事务通知一样。使用EJB CMT,除了使用setRollbackOnly(),你没有办法能够影响容器的事务管理。 5、spring不提供高端应用服务器的跨越远程调用的事务上下文传播。如果你需要这些特征,推荐你使用EJB。然而,不要轻易使用这些特性。通常我们并不希望事务跨越远程调用。 回滚规则的概念:他们使得我们可以指定哪些异常应该发起自动回滚。我们在配置文件中,而不是Java代码中,以声明的方式指定。因此,虽然我们仍然可以编程调用TransactionStatus对象的setRollbackOnly()方法来回滚当前事务,多数时候我们可以指定规则,如MyApplicationException应用导致回滚。这有明显的优点,业务对象不需要依赖事务基础设施。例如:通常不需要引入任何Spring API,事务或其他任何东西。 EJB的默认行为是遇到系统异常(通常是运行是异常),EJB容器自动回滚事务。EJB CMT遇到应用程序异常(除了java.rmi.RemoteExcepiton外的checked异常)是不需要自动回滚事务。虽然Spring声明式事务管理沿用EJB的约定(遇到unchecked异常自动回滚事务),但是这是可以定制的。 Spring声明式事务管理的性能要胜过EJB CMT。
<?xml version="1.0" encoding="UTF-8"?> <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" 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"> <!-- 打开配置项,这个配置项是对@Aspectj这个注解进行支持 注解本身是不能干活的,注解之所以能干活是因为后面有处理器对其进行处理 这个配置相当于我们将要使用的@Aspectj注解提供了解析的功能 --> <aop:aspectj-autoproxy /> <context:component-scan base-package="com.sample.*"/> <bean id="apectBean" class="com.sample.service.MyInterceptor2"/> <aop:config> <aop:aspect id="asp" ref="apectBean"> <aop:pointcut id="mycut" expression="execution (void com.sample.service.impl.PersonServiceBean*.*(String))"/> <aop:before pointcut-ref="mycut" method="doAccessCheck" arg-names="name" /> <aop:after pointcut-ref="mycut" method="doAfter"/> <aop:after-returning pointcut-ref="mycut" method="doAfterReturning"/> <aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/> <aop:around pointcut-ref="mycut" method="doBasicProfiling"/> </aop:aspect> </aop:config> <aop:config> <aop:aspect id="myAOP" ref="check"> <aop:pointcut id="target" expression="execution(* com.sample.service.Common.execute2(..))"/> <aop:before method="checkValidator" pointcut-ref="target"/> <aop:after method="addLog" pointcut-ref="target"/> </aop:aspect> </aop:config> </beans>
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 2009 次