Spring 1.0的标准事务配置
先定义一个baseTxService进行基本的事务定义,类型为TransactionProxyFactoryBean。如果service没有基于接口,使用cgilib来实现AOP,定义<property name="proxyTargetClass" value="true"/>
实际的Manager类设置parent=baseTxService,target 为匿名的实际Manager类。如果需要定义特殊的事务,利用merge=true的属性,在manager的transactionAttributes节点进行新事务的定义。
<bean id="baseTxService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
</props>
</property>
<property name="preInterceptors">
<list>
<ref bean="methodSecurityInterceptor"/>
</list>
</property>
</bean> <bean id="bookManager" parent="baseTxService">
<property name="target">
<bean class="org.springside.bookstore.admin.manager.BookManager"/>
</property>
</bean>Spring 2.0的新配置:
如果如果service没有基于接口,使用cgilib来实现AOP,定义proxy-target-class="true"
<aop:config proxy-target-class="true">
<aop:advisor pointcut="execution(* com.xyz.service..*Manager.*(..))" advice-ref="txAdvice"/>
<aop:advisor pointcut="execution(* com.xyz.service..*Manager.save(..))" advice-ref="fooAdvice"/>
</aop:config><tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<bean id="bookManager" class="org.springside.bookstore.commons.service.BookManager"/> 其中com.xyz是你的项目package限定前缀。
2.进步
1. AOP的配置方式也AOP了。
对比1.0的配置文件,因为下面2提到的限制,事关安全acegi methodSecurityInterceptor 拦截器要配置在关于事务的TransactionProxyFactoryBean的preInterceptors属性里,这样子就一点不AOP了。
而2.0使用ponintcut expression,很AOP的配置一切Aspect。
2. 1.0时,一个已经AOP过的object不能再次被AOP。
在Spring 1.0的文档里Rod说,比如<bean id="bookManager" parent="baseTxService">已经进行了一次AOP,如果想在这个Bean上再配一层AOP,比如要对方法执行结果缓存,无论以1.0 还是2.0的方式定义,cglib方式是会报错的,而基于接口的方式,结果不确定。
3. BookManager能直接定义自己,而不是像1.0那样作匿名内部target。
虽然在1.0时代的BeanNameAutoProxyCreator 达到类似作用,但只能用BeanName来模糊匹配比较危险,没有AspectJ的pointcut语法细致。
3. 语法
满江红翻译的 Spring参考文档 6.3 schema-based AOP support 提供了aspect,advisor,advide三种组装方法的解释,其中aspect是aspectJ原装,但稍复杂。
唯一有点难懂的是pointcut里的语法,其实也很好学,Spring参考文档6.2.3.4 示例里有完整说明 ,其实一排子过去是
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)其中带问号的modifiers-pattern?(public/protected) 和 declaring-type-pattern? throws-pattern? 可以不填
execution(* *..BookManager.save(..))的解读:
第一颗* 代表ret-type-pattern 返回值可任意,
*..BookManager 代表任意Pacakge里的BookManager类。
如果写成com.xyz.service.* 则代表com.xyz.service下的任意类
com.xyz.service..* com.xyz.service则代表com.xyz.service及其子package下的任意类
save代表save方法,也可以写save* 代表saveBook()等方法
(..) 匹配0个参数或者多个参数的,任意类型
(x,..) 第一个参数的类型必须是X
(x,,,s,..) 匹配至少4个参数,第一个参数必须是x类型,第二个和第三个参数可以任意,第四个必须是s类型。
注意事项:
1. name-pattern千万不要写成*..*Manager ,这样子会把所有第三方类库的Manager比如Spring的PlatformTranstationManager 也加入aop,非常危险。所以最好还是加上项目的package前缀,如"org.springside..*Manager"
2. 因为有*,会修饰所有方法,有些hibernateTemplate的final的方法不能被cglib修改,会抛warning,无害。
4. 事务定义选项
事务定义一般默认的PROPAGATION_REQUIRED即可,另提供的几个选择很少使用。值得注意的是一个PROPAGATION_NESTED,嵌入式事务的意义在于多级事务,如果出错只rollback子事务自己,不rollback主事务的所有操作。比如OrderManager的shipOrder函数 调用 save函数,如果save()被定义为嵌入式事务,当进入save()时,会存储save point。如果在save 中出错,会rollback 到刚才的save point,但不影响其他的操作。这需要JDBC3.0 SavePoint功能的支持。 而一般service间互相嵌入调用时,如果都定义为PROPAGATION_REQUIRED,有其中一个操作出错,rollback全部操作。
分享到:
相关推荐
在IT行业中,Spring框架是...Spring 2.0引入了基于AOP(面向切面编程)的声明式事务管理,使得事务配置更加直观。 在`applicationContext.xml`配置文件中,我们可以设置事务管理器和声明事务的行为。例如: ```xml ...
### Spring 2.0 声明式事务配置详解 #### 一、Spring 2.0 声明式事务概述 随着 Spring 框架的发展,从 Spring 1.x 到 Spring 2.0 版本,声明式事务管理方式有了显著改进。在 Spring 1.x 中,主要通过 AOP 方式实现...
Spring 2.0强化了与Java EE规范的集成,包括JTA事务管理、EJB3集成以及对JavaServer Faces的支持,使得开发者可以在不牺牲Spring优点的前提下,充分利用Java EE的功能。 总结,这份中文版的Spring 2.0技术文档全面...
AOP允许开发者将横切关注点(如日志、事务管理等)与业务逻辑分离,实现代码的模块化。在Spring 2.0中,你可以定义切面、切点、通知和织入策略,从而提高代码的可读性和可维护性。 再者,Spring 2.0还包含了一个...
《Spring2.0宝典源代码》是一份珍贵的学习资源,由知名作者李刚编写,旨在深入解析Spring框架的2.0版本。这份源代码集合是配合书籍《Spring2.0宝典》使用的,读者可以通过实际操作代码来理解和掌握Spring 2.0的核心...
本文将详细介绍Spring 2.0的声明式事务配置以及如何简化这一过程。 首先,Spring提供了多种事务管理器,以适应不同的持久层技术和环境。对于单一资源,可以选择如DataSourceTransactionManager(适用于JDBC)、...
Spring 2.0是Spring框架的一个重要版本,它在Java企业级应用开发中扮演着核心角色。本教程将深入探讨...文档`spring2.0-reference_final_zh_cn.chm`将详细阐述这些概念和技术,帮助你成为一名熟练的Spring开发者。
Spring 2.0是Java开发中的一个里程碑,它在企业级应用开发中扮演着至关重要的角色,特别是对于依赖注入(IoC)和面向切面编程(AOP)的支持。本学习提纲旨在为初学者提供一份详尽的Spring 2.0学习指南,帮助他们系统...
Spring 2.0加强了AOP支持,允许开发者定义和执行横切关注点,如日志记录、事务管理等。@Aspect注解用于定义切面,@Before、@After、@Around等用于指定通知类型。此外,Spring还支持自定义注解作为切入点表达式,提高...
### SPRING2.0开发详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,用于构建企业级应用程序和服务。它最初由Rod Johnson在2004年创建,并随着时间的发展不断壮大和完善。Spring 2.0版本是Spring...
2. **AOP(面向切面编程)**:Spring 2.0提供了更强大的面向切面编程支持,使得开发者可以将关注点分离,如日志、事务管理等,从而降低代码复杂性。AOP代理包括JDK动态代理和CGLIB代理,允许开发者定义切入点和通知...
同时,还可以了解基于XML的事务配置和基于注解的事务配置的区别。 第四,Spring 2.0在数据访问层也有所提升,如JDBC抽象层的增强,使得数据库操作更加简洁和安全。源码中会展示如何使用`JdbcTemplate`和`...
《Spring 2.0 核心技术与最佳实践》是由知名IT教育家廖雪峰编写的教程,旨在为从初学者到高级工程师提供全面而深入的Spring 2.0框架理解与应用指导。Spring框架是Java开发中的核心工具,尤其在企业级应用中广泛使用...
Spring 2.0引入了基于注解的AOP配置,极大地简化了AOP的使用。这篇博客文章将探讨如何在Spring 2.0中使用AOP实例,特别是通过注解来实现。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了...
2. **AOP(面向切面编程)**:Spring 2.0提供了更强大的面向切面编程支持,允许开发者定义切面、通知(advisors)和切点(pointcuts),并将其应用于业务代码,实现如日志、事务管理等功能。切面可以是接口、类或...
2. **AOP(面向切面编程)**:Spring2.0引入了全面的AOP支持,允许开发者定义和执行横切关注点,如日志、事务管理等,从而实现代码的模块化,提高代码的复用性和可维护性。 3. **IoC容器增强**:在Spring2.0中,IoC...
在"配置SPRING2.0"的文件中,可能包含的是Spring 2.0的应用上下文配置文件,用于定义Bean、数据源、事务管理器等组件的配置。学习如何正确配置这些元素是理解和使用Spring 2.0的关键步骤。配置文件通常使用XML格式,...
这个压缩包包含了Spring 2.0版本的源代码,为程序员提供了宝贵的探索与学习平台。Spring作为Java领域的主流框架,其2.0版本是一个重要的里程碑,引入了许多创新特性,提升了框架的灵活性和可扩展性。 在Spring 2.0...