- 浏览: 238509 次
- 性别:
- 来自: 北京
最新评论
-
Xgeeeeek:
讲的很细致,多谢~
JAVA RMI 实例 -
zontim:
...
JAVA RMI 实例 -
czl026:
简单明了,谢谢
[JMX一步步来] 1、JMX的Hello World -
manxisuo:
jtianguo 写道服务端和客户端在同一个包下,这句代码He ...
JAVA RMI 实例 -
manxisuo:
非常好,多谢!!
JAVA RMI 实例
Spring 2.0 AOP 与事务配置
************Spring 1.0的标准事务配置***************
先定义一个baseTxService进行基本的事务定义,类型为TransactionProxyFactoryBean。如果service没有基于接口,使用cgilib来实现AOP,定义
<property name="proxyTargetClass" value="true"></property>
实际的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"/>
<bean class="org.springside.bookstore.commons.service.BookManager" id="bookManager"></bean>其中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"></bean>已经进行了一次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全部操作。
发表评论
-
Lucene全文检索样例(解决大文本建索引)
2008-01-31 10:05 6532建索引:package com.pccw; i ... -
txt读取字符串(为实习生作的例子)
2008-01-29 18:27 1984try { FileInputStream fi = n ... -
关于Lucene索引合并解决方法
2008-01-28 10:21 9337由于Clustor的问题造成无法对索引进行同步,脑子中马上浮现 ... -
关于Soeckt 流操作的数据转换工具方法
2007-11-02 10:50 2225java 代码 package com ... -
Java socket开发实例入门
2007-08-21 16:08 12231socket用中文意思就是我 ... -
不使用webwork标签直接用Jsp取得Action中的值
2007-05-22 14:23 3098今天突然一个同事问我webwork如果不用标签只用JSP ... -
23种模式趣味解释
2007-05-22 10:36 2038创建型模式 1、FACTORY ... -
关于领域逻辑的三个主要模式
2007-05-13 22:36 2735事务脚本 事务脚本比较好理解,简单来说,就是将大多是事务,以过 ... -
又谈领域模型
2007-04-29 09:58 2273昨天,突然和阿敏谈起领域模型,发现自己的理解还是 ... -
简单Socket编程,来理解Socket
2007-02-27 09:34 2261Server端: java 代码 p ... -
[JMX一步步来] 9、基于JBoss来写MBean
2007-02-02 13:31 13855前面都是用JDK自带的JMX ... -
[JMX一步步来] 8、编写程序来连接MBean
2007-02-02 13:18 5970前面用Html、jconsole等方法连接上了MBeanSer ... -
[JMX一步步来] 7、用JDK5.0的JConsole来连接MBean
2007-02-02 13:09 8671前面所有看效果都是通过Html网页来看的。JDK5.0自带了一 ... -
[JMX一步步来] 6、模型Bean:Model Bean
2007-02-02 13:06 5783在上一节是用apache的commons-modeler来开发 ... -
[JMX一步步来] 5、用Apache的commons-modeler来辅助开发JMX
2007-02-02 12:59 7008一、前言 每一个MBean都要有一个接口,比如前面的H ... -
[JMX一步步来] 4、动态MBean:DynamicMBean
2007-02-02 12:48 6569一、前言 动态MBean是在运行期才定义它的属性和方法 ... -
[JMX一步步来] 3、Notification的使用
2007-02-02 12:36 6237一、简介 Mbean之间的通信是必不可少的, ... -
[JMX一步步来] 2、JMX简介
2007-02-02 11:25 8812一、JMX简介 JMX是一 ... -
[JMX一步步来] 1、JMX的Hello World
2007-02-02 11:23 10223一、JMX简介 什么是JMX?在一篇网文中是这样说的: ... -
JAVA RMI 实例
2007-02-02 10:51 39374JAVA RMI 快速入门实例 本实例为参考多篇文章写就而成 ...
相关推荐
在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...