首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring 事务配置的几种方式及应用举例来说

2013-11-09 
Spring 事务配置的几种方式及应用举例我以前在项目中的实践选择过程,最终选择第三种方案,几种都写出来与大

Spring 事务配置的几种方式及应用举例

我以前在项目中的实践选择过程,最终选择第三种方案,几种都写出来与大家分享。 大家有其他好的方式,也欢迎分享。

环境:JDK 1.4.x , Hibernate 3.1, Spring 2.0.6, 开发模式: Service + DAO

1. 代理工厂Bean事务管理( *ProxyFactoryBean) + Service + DAO配置

??? 我刚开始看Spring时用的书是林信良的《Spring技术手册》,书中对声明式事务主要采用 TransactionProxyFactoryBean,业务Bean如 Service或BO类继承它来进行事务控制。代理工厂Bean( *ProxyFactoryBean)这一类Spring提供的工厂类,可将一个 bean 进行委托代理,从而达到控制方法行为的目的。

?? 此类事务配置一般如下(因为我们未采用这种方式,就以书上的JDBC datasource举例说明。不同公司采用的格式可能有所不同):

<!-- 前面的 dataSource等配置略 ........ --><!-- 事务管理器 --><bean id="transactionManager" /></property></bean><!-- 事务模板 --><bean id="baseTransactionProxy"ref="transactionManager" /><property name="transactionAttributes"><props><prop key="*">PROPAGATION_REQUIRED</prop>   <!-- 本文仅简单用一种方式说明。所有方法起事务,可以修改以精细和区别性控制事务 --></props></property></bean><!-- 业务对象 --><bean id="authService" parent="baseTransactionProxy"><property name="target"><bean ref="authDao" /></bean></property></bean><bean id="departmentService" parent="baseTransactionProxy"><property name="target"><bean ref="departmentDao" /></bean></property></bean><!-- 数据访问对象 --><bean id="authDao" ref="dataSource" /></bean><bean id="departmentDao" ref="dataSource" /></bean>


? 这种代理工厂Bean的事务管理一般都要求将 Service 的 bean 配置为 , 上面的例子使用了 parent="baseTransactionProxy" 继承机制简化了原书中的配置。

?? 代码中通过以下方式使用:
?

??

AuthService authService = (AuthService) context.getBean("authService");     boolean b = authService.hasPermission("TOKEN_XXXXX"); 

?

2. 自动代理事务(*AutoProxyCreator) + Service + DAO配置

??? *AutoProxyCreator这一类东东,能够自动为Spring容器中的bean进行 AOP 代理,配置起来能适当简化。一般需要用 BeanNameAutoProxyCreator 来配置对那些类进行自动代理, MethodPointcutAdvisor 来配置对哪些方法进行代理。

??? 这种声明式事务配置采用拦截器(Interceptor)或通知器(Advisor) 进行事务控制,这里使用了Spring提供的 TransactionInterceptor 来管理事务。 (本质上 ProxyFactoryBean 也要生成被代理对象的字节码,不过每个类型的ProxyFactoryBean 只能固定处理一个 Aspect,不算真正的AOP)。

??? 以下配置对 *Service 的所有方法进行事务控制。???

<bean id="transactionManager" />
??</property>
?</bean>?


?

<!-- 事务管理拦截器 --> <bean id="transactionInterceptor" /> </property> </bean> <!-- 配置要拦截哪些类,并使用那些拦截器 --> <bean id="ServiceAutoProxyCreator" value="true"></property> <property name="beanNames"> <list> <value>*Service</value> </list> </property> <property name="interceptorNames"> <list>  <!-- 头三个是我们项目中用的其他 Advisor,这里展示了添加拦截器进行aspect控制的灵活性。省略他们的配置 --> <value>monitorMethodPointcutAdvisor</value> <value>asynmonitorMethodPointcutAdvisor</value> <value>businessLogMethodPointcutAdvisor</value> <value>trasactionMethodPointcutAdvisor</value> <!-- 事务拦截器, 直接配成 transactionInterceptor 去掉 trasactionMethodPointcutAdvisor bean 也可以, --> </list> </property> </bean> 

?
Service,DAO的配置方式稍微改变一下, Service不再作为ProxyFactoryBean的 target属性,而是一个顶级 bean,这样 Service bean看起来就更单纯一些。?

<!-- 业务对象 --> <bean ref="authDao" /> </bean> <bean ref="departmentDao" /> </bean> <!-- 数据访问对象 --> <bean id="authDao" ref="dataSource" /> </bean> <bean id="departmentDao" ref="dataSource" /> </bean> 

?
??? 代码中的使用方式不变,同 1 小节。

3.? 自动代理 +? Service DAO零配置

??? 这种是我们项目中运用的方式,transactionInterceptor,trasactionMethodPointcutAdvisor ,ServiceAutoProxyCreator 三个 bean的配置不变。
??? Service,DAO 无需配置, 其原理参见我另一篇文章:

我的开发经验分享(一)-Spring业务bean零配置


??? 代码中的使用方式不同,使用 ServiceFactory 直接创建bean,代码如下:?
????

???

AuthService authService = (AuthService)ServiceFactory.createBean(AuthService.class);     boolean b = authService.hasPermission("TOKEN_XXXXX"); 

?
??? ServiceFactory 内部会自动注册未注册的 bean, 并和Spring 容器和已配置的拦截器关联。
 

4. Annotation 声明事务

??? 如果是 JDK 1.5下,Spring 也支持 注释声明式事务,类似于如下代码(附部分片段):

@Transactional public class PersonServiceImpl implements PersonService { private EntityManager em;    @PersistenceContext   public void setEntityManager(EntityManager em)   { this.em = em; } 

?
?? 结合?<property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> <!-- 所有方法起事务,还可以精细控制事务 --> </props> </property>

?
转移到了Java代码中,本质上是一样的,两种方式都能进行精细事务管理。不过个人不太偏好这种方式,因为xml更便于集中管理,修改后无需编译。

?

1.5下Spring还用哪种更简化的事务管理方式,鄙人不是太熟,欢迎大家分享。

?

1 楼 raymond2006k 2008-09-26   沙发自己坐,哈哈。

热点排行