`

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方法时,其实是执行增强过的方法.所以可以完成更新事务.
分享到:
评论

相关推荐

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

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

    Spring框架-AOP和声明式事务

    Spring框架-AOP和声明式事务

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

    NULL 博文链接:https://quicker.iteye.com/blog/674029

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

    用spring AOP(包括几种常用的通知类型)做的小程序

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

    NULL 博文链接:https://tonl.iteye.com/blog/2093314

    Spring3配置声明式事务

    在Spring3中配置声明式事务比早期版本显得更加简便。只需要几行配置文件+注解就可以实现面向切面的AOP事务

    spring声明式事务配置

    &lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;beansxmlns=...aop-2.5.xsd"&gt;

    spring声明式事务管理

    1.掌握Myeclipse的使用。 2.掌握spring框架和hibernate框架的使用。 3. 掌握整合spring和hibernate的持久化操作编程 4.掌握基于AOP的声明式事务编程...3.配置WEB-INF/applicationContext.xml提供基于AOP的声明式事务

    深入理解Spring声明式事务:源码分析与应用实践

    Spring通过@Transactional注解以及底层的AOP和代理机制实现了声明式事务。这个机制允许开发者通过简单的注解就能控制事务的边界和规则,极大地简化了编程模型。在Spring中,事务管理是通过一系列的拦截器和事务管理...

    spring2.0声明式事务

    spring声明式事务的配置 3. spring2.0配置事务 a) 将spring 1.2升级到spring2.0 i. 去掉spring1.2相关的包 ii. 添加spring2.0的jar包:spring.jar,aspecjrt.jar,aspectjweaver.jar 和cglib-nodep-2.1.3,jar iii. ...

    Spring2.5和Hibernate3集成--学习spring aop ioc

    采用声明式事务 1.声明式事务的配置 * 配置sessionFactory * 配置事务管理器 * 配置事务的传播特性 * 配置哪些类哪些方法使用事务 2.编写业务逻辑方法 * 继承HibernateDaoSupport类,使用this....

    Spring框架资料,Ioc容器, AOP面向切面编程 ,声明式事务 ,Spring5新特性

    Spring框架资料,Ioc容器, AOP面向切面编程 ,声明式事务 ,Spring5新特性

    Spring添加声明式事务.docx

    Spring提供了声明式事务处理机制,它基于AOP实现,无须编写任何事务管理代码,所有的工作全在配置文件中完成。 二、声明式事务的XML配置方式 为业务方法配置事务切面,需要用到tx和aop两个命名空间下的标签,先在...

    MyBatis Spring声明式事务管理示例代码

    Spring的声明式事务管理是采用AOP(Aspect-Oriented Programming,面向切面编程)实现的。在编程式事务管理中,各事务处理代码实际上是相似的,这就造成了代码重复;而且编程式事务管理会造成事务管理代码和被管理的...

    Spring的AOP

    Spring的一个关键组件就是AOP框架 Spring的IoC容器并不依赖于AOP,也就是说,是不是用AOP都是你自己的选择;...声明式事务管理建立在Spring事务管理抽象之上 允许用户定义自己的方面,使用AOP来完善OOP的使用

    spring源码分析(1-10)

    Spring源代码解析(六):Spring声明式事务处理 Spring源代码解析(七):Spring AOP中对拦截器调用的实现 Spring源代码解析(八):Spring驱动Hibernate的实现 Spring源代码解析(九):Spring Acegi框架鉴权的实现 ...

    Spring配置事务在DAO层和业务逻辑层

    Spring通过AOP实现声明式事务管理。通常通过TransactionProxyFactoryBean设置Spring事务代理。

    spring事务详解

    Spring的事务框架将开发过程中事务管理相关的关注点进行适当的分离,并对这些关注点进行合 理的抽象,最终打造了一套使用方便,...带来了原来只有CMT才有的声明式事务管理的特殊待遇,却无需绑定到任何的应用服务器上。

Global site tag (gtag.js) - Google Analytics