Spring事务之TransactionProxyFactoryBean

本篇文章想分为两部分来说明用TransactionProxyFactoryBean配置事务的过程,第一部分介绍几个用到的类、接口或方法,第二部分说明一下事务处理过程。

 

一,重要接口、类、字段、方法介绍:

1,org.springframework.beans.factory      Interface FactoryBean

这个接口是所有FactoryBean的祖宗接口,FactoryBean可以理解为工厂类。Spring里有很多工厂类,当然我们也可以通过实现此接口定义自己的工厂类。但无论如何,只要是实现了此接口的类,容器在处理时,不是直接返回它们本身的对象,而是调用FactoryBean接口提供的getObject()方法,返回产品的对象。

所以getObject是此接口最重要的方法,其实现类必须实现这个方法,来制造产品。

 

ps:记得BeanFactory里有一个属性吗?

String FACTORY_BEAN_PREFIX = "&"

现在明白了,如果要通过getBean得到FactoryBean本身,要在name前加上"&"。

 

2,org.springframework.beans.factory     Interface InitializingBean

这个接口只有一个方法:afterPropertiesSet(),容器在处理实现这个接口的类时,会在所有属性注入以后,自动调用afterPropertiesSet方法。方法中一般会做一些初始化或检查属性注入是否完成的工作。

 

3,org.springframework.aop.framework    Class AbstractSingletonProxyFactoryBean

顾名思义,是个虚类,是以singleton的代理类为产品的工厂类基类。它实现了上面讲的两个接口,在afterPropertiesSet方法中通过ProxyFactory类生成了代理类;在getObject里把这个制作好的代理类返回。

这里边有个虚函数很重要:

protected abstract Object createMainInterceptor();

因为在afterPropertiesSet方法中要通过这个方法把一个Advisor注入进代理类,Advisor决定代理类进行的具体操作。所以此接口实现类要通过实现此方法,把pointcut和interceptor包装成Advisor,并返回。

 

4,org.springframework.transaction.interceptor      Class TransactionProxyFactoryBean

今天的主菜。继承了AbstractSingletonProxyFactoryBean虚类,并且加入了事务处理。

首先它new了一个TransactionInterceptor类对象作为类属性,然后在createMainInterceptor方法中包装成Advisor返回。这样,虚类中的AfterPropertiesSet方法就可以把此Advisor注入到代理类。也就是说,最后生成的代理类要进行的额外操作,由TransactionInterceptor来控制。

 

5,org.springframework.transaction.interceptor      Class TransactionInterceptor

里面只有一个重要方法invoke,实际上也不难理解,在实际调用目标方法之前之后加一些其它操作,在这里进行的是事务处理。在实际调用目标方法之前开启事务,之后根据是否抛出错误进行提交或回滚。

它的超类TransactionAspectSupport持有一个PlatformTransactionManager类的引用,具体的事务操作由它负责,TransactionInterceptor和TransactionAspectSupport只是负责之间的调用,有点像个控制器。

 

6,org.springframework.jdbc.datasource      Class DataSourceTransactionManager

 

7,org.springframework.orm.hibernate3      Class HibernateTransactionManager

6和7是两个PlatformTransactionManager的子类,分别对应DataSource和Hibernate的事务处理。这两者有一些区别,比如用DataSource时,必须在代码中抛出异常事务才起作用;而Hibernate则不需要抛出异常。这主要是因为在doCommit方法中,对于提交和捕获异常的处理有一些不同。Hibernate是通过flush来提交,在这次提交时如果出问题也会报RuntimeException的异常,同样会回滚;而DataSource则是直接connection.commit(),它抛出的异常属于sqlexception,不属于runtimeException,所以没有被捕获也没有回滚。

 


二,事务处理过程

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值