`

Spring中的AOP,以及声明式事务

阅读更多
AOP的原理已经不是什么秘密.
代理实现更是很多年前就有的事..
在Spring中,基于Java动态代理,但这个必须基于接口.
所在在Spring中还有基于类的的代理,就是使用了CGLIB.
更多的可以参考http://www.redsaga.com/spring_ref/2.5/html/aop-api.html

声明式事务就是基于AOP实现,轻量级容器带来的基础设施!
使用Spring中的工厂bean   : TransactionProxyFactoryBean

注解的使用更是方便
在配置文件中加入
<tx:annotation-driven transaction-manager="txManager"/>
引用
实际上,如果你用 'transactionManager' 来定义 PlatformTransactionManager bean的名字的话,你就可以忽略 <tx:annotation-driven/> 标签里的 'transaction-manager' 属性。 如果 PlatformTransactionManager bean你要通过其它名称来注入的话,你必须用 'transaction-manager' 属性来指定它


引用
@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。 然而,请注意只是使用 @Transactional 注解并不会启用事务行为, 它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 <tx:annotation-driven/>元素的出现 开启 了事务行为。

Spring团队的建议是你只在具体的类上使用 @Transactional 注解, 而不要注解在接口上。你当然可以在接口(或接口方法)上使用 @Transactional 注解, 但是这只有在你使用基于接口的代理时它才会生效。因为注解是 不能继承 的, 这就意味着如果你正在使用基于类的代理时,事务的设置将不能被基于类的代理所识别,而且对象也不会被事务代理所包装 (这是很糟糕的)。 因此,请接受Spring团队的建议,在具体的类(包括该类的方法)上使用 @Transactional 注解。

注意:在代理模式下(默认的情况),只有从代理传过来的‘外部’方法调用才会被拦截。 这就意味着‘自我调用’是不会触发事务的,比如说,一个在目标对象中调用目标对象其他方法的方法是不会触发一个事务的,即使这个方法被标记为 @Transactional!
如果你期望‘自我调用’被事务覆盖到,可以考虑使用AspectJ 模式(如下所示)。在这种情况下,一开始就没有任何代理的存在; 为了把@Transactional的方法变成运行时的行为,目标类会被‘编织’起来(比如修改它的字节码)。


是运用JAVA动态代理还是使用CGLIB可以配置
引用
在<tx:annotation-driven/>元素上的"proxy-target-class" 属性 控制了有什么类型的事务性代理会为使用@Transactional 来注解的类创建代理。 如果"proxy-target-class" 属性被设为"true",那么基于类的代理就会被创建。 如果"proxy-target-class" 属性被设为"false" 或者没设,那么会创建基于接口的标准JDK代理


----------------------------------------------------------------

注意点:在代理模式下(默认的情况),只有从代理传过来的‘外部’方法调用才会被拦截。 这就意味着‘自我调用’是不会触发事务的,比如说,一个在目标对象中调用目标对象其他方法的方法是不会触发一个事务的,即使这个方法被标记为 @Transactional!

引用
cglib是继承原来的类,jdk proxy是继承Proxy类,返回的是一个新的"包装"过的类,但原来Object方法中(super中)的调用还是属于super中的

也就是说AOP不支持嵌套
http://www.iteye.com/topic/47879

一个类的方法调用另一个方法,是不能增强的.Spring中使用基于接口和类的实现,实际上我们使用的是增强后的子类,如果直接调用就只是调用了原始方法,没有做到增强...

	@Transactional //(1)
	public ArticleView getArticleView(String articleId) {
		
		Article article = articleDao.query(IntegerUtil.parseInt(articleId));
		article.setHot(article.getHot()+1);
		updateArticle(article);
				return articleRepository.buildArticleView(articleId);
	}

         @Transactional  //(2)
	public void updateArticle(Article article) {
		// TODO Auto-generated method stub
		articleDao.update(article);
	}


以上代码中如果把(1)处的注解注释掉,那么就会出现
Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
异常.
原因是这儿直接原始调用,并不是调用增强类的方法..
在上面的示例中,可以把(2)处的注解去掉,但(1)处的绝对不再去掉....
因为外部在调用getArticleView方法时,其实是执行增强过的方法.所以可以完成更新事务.
分享到:
评论

相关推荐

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...

    spring AOP(声明式事务管理)小程序

    在本“spring AOP(声明式事务管理)小程序”中,我们将深入探讨Spring AOP如何实现声明式事务管理,以及相关的通知类型。 1. **什么是声明式事务管理**: 声明式事务管理是相对于编程式事务管理而言的,后者需要在...

    使用Spring的声明式事务----AOP方式

    本文将深入探讨如何利用Spring的声明式事务来处理业务操作中的数据一致性问题,以及相关源码解析。 首先,我们需要了解Spring的AOP概念。AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以包含业务逻辑的...

    Spring ax/aop声明式事务配置实例

    通过以上步骤,我们成功地在Spring中实现了AOP声明式事务配置。这种方式使得事务管理与业务逻辑分离,代码更简洁、易维护。但需要注意,虽然声明式事务方便,但在复杂场景下可能需要结合编程式事务管理,以获得更高...

    Spring框架-AOP和声明式事务

    Spring框架-AOP和声明式事务

    spring+mybatis的声明式事务

    在Spring+MyBatis的声明式事务中,这些特性由Spring的事务管理器保证。例如,如果在事务过程中发生异常,Spring会自动回滚事务以保持数据的一致性。 7. **事务的隔离级别** Spring支持四种事务隔离级别:READ_...

    spring基于AOP实现事务

    总结一下,Spring基于AOP实现的事务管理通过TransactionProxyFactoryBean,结合声明式事务配置,能够提供一种高效且易于维护的事务解决方案。它允许我们在不修改业务逻辑的情况下,统一管理和控制事务,提升了代码的...

    Spring使用XML配置声明式事务

    在Spring框架中,声明式事务管理是实现事务处理的一种高效且灵活的方式,它允许开发者通过XML配置或注解来定义事务边界,而无需在业务逻辑代码中显式地调用开始、提交或回滚事务的方法。这篇博文"Spring使用XML配置...

    Spring及AOP应用(事务与集成)培训

    我们会讲解如何创建Bean,如何使用注解进行依赖注入,如何编写AOP切面,以及如何配置声明式事务。此外,我们还将学习如何利用Spring的集成特性连接数据库,并进行数据操作。 总的来说,这次“Spring及AOP应用(事务...

    Spring源代码解析(六):Spring声明式事务处理.doc

    Spring 中的事务处理可以分为两种方式:声明式事务处理和编程式事务处理。声明式事务处理通过 AOP 的实现,把事务管理代码作为方面封装到业务代码中,使得事务管理代码和业务代码解藕。这使得事务管理变得更加灵活...

    Spring 2.5 AOP 例子

    Spring AOP提供了一种模块化和声明式的方式来实现横切关注点,如日志记录、事务管理、性能监控等。它通过切面(Aspect)将这些关注点与业务逻辑分离,降低了系统的耦合度。 二、类扫描功能 在Spring 2.5中,引入了...

    spring3,hibernate4 配置声明式事务管理(annotation方式)

    然后,启用Spring的AOP代理和声明式事务管理。在配置文件中加入以下内容: ```xml &lt;aop:config&gt; &lt;aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))"/&gt; &lt;aop:advisor ...

    Spring声明式事务处理

    文件名为`Spring声明式事务处理-1.mht`到`Spring声明式事务处理-5.mht`,通过阅读这些文件,你将能够深入理解Spring声明式事务处理的各个方面,包括配置、使用场景、最佳实践以及常见问题的解决方法。

    spring声明式事务管理配置方式

    - 声明式事务管理背后的实现原理是基于Spring的AOP(面向切面编程),它会在方法执行前后应用事务增强,从而实现事务的自动管理。 在提供的链接中,博主可能详细解释了这些概念,并给出了实际的应用示例,包括如何...

    spring声明式事务处理demo

    编程式事务管理通常通过AOP(面向切面编程)的TransactionTemplate或PlatformTransactionManager接口直接在代码中控制事务,而声明式事务管理则是基于AOP的,通过配置XML或使用注解来定义事务边界。 1. **配置...

    Spring aop、jdbc和事务tx练习

    声明式事务管理允许开发者在配置文件中声明哪些方法需要在事务中运行,而无需在代码中显式管理开始和结束事务。这通常通过@Transactional注解实现,可以应用于类或方法级别。编程式事务管理则需要在代码中手动调用...

    Spring-Aop所有jar

    3. 注解驱动的事务管理:Spring AOP可以和Spring的声明式事务管理配合使用,通过@Transactional注解实现事务控制。 4. 支持更多类型的代理:除了默认的JDK动态代理,Spring 4.0也支持使用CGLIB代理,对于没有接口的...

    spring+ibatis声明式事务Demo_

    本示例“spring+ibatis声明式事务Demo”将探讨如何在Spring与iBatis集成环境中使用声明式事务管理。声明式事务管理允许开发者通过配置来控制事务,无需在代码中显式处理事务开始、提交和回滚。 **Spring框架** 是一...

Global site tag (gtag.js) - Google Analytics