Spring3.04和Junit4

在Spring3.x以上必须采用Junit4.8以上,否则可能出现问题。 在Spring相关的测试中如果使用事务采用AbstractJUnit4SpringContextTests
如果不采用事务管理采用AbstractJUnit4SpringContextTests,注意在spring中测试时候必须注意junit4中事务
默认测试中为回滚的了。
package com.easyway.web.services.component.job;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Assert;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:services/service-*.xml","classpath:services/ext/service-*.xml",
		"classpath:services/ext/YichengYunwei/service-*.xml"})
public class InspectionJobTest extends AbstractJUnit4SpringContextTests{



	@Autowired
	InspectionJob myJob;
	
	@Test
	public void testDoJob() {
	
	
	}

}

 

spring3多个事务管理器的使用

被忽略的Spring3小改进——支持多数据源的@Transactional事务注解

在用@Transactional配置事务时,确实没注意过多数据源问题,但是记得之前常用的XML配置方式中,对多数据源支持很简单,我想注解配置起来应该也不会太麻烦。

 

先回顾一下之前个人习惯使用的 <tx:advice> + <aop:config>配置方式,大致步骤如下:
1)定义与事务管理器对应的事务通知
2)配置需要拦截的方法调用切面
3)将切入点连接到相应的事务通知
整个系统的事务,三下配置,一处搞定,相比注解方式,个人觉得更简单、省力、统一;而要支持多数据源,再做一遍这123即可,非常简单。

 

不过同事在网上百度了一圈,说大部分的结论是Spring的@Transactional注解不支持,听到这一点我很诧异,不应该啊,要不查查Spring的官方文档?

一查马上发现,在Spring3.0的参考文档中,针对这个问题的,真新增了一节(10.5.6.2)来解决,参见:
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations 

Most Spring applications only need a single transaction manager, but there may be situations where you want multiple independent transaction managers in a single application. The value attribute of the
@Transactional annotation can be used to optionally specify the identity of the
PlatformTransactionManager to be used. This can either be the bean name or the qualifier value
of the transaction manager bean

 

也就是说,在Spring2.5之前,@Transactional注解确实不支持多数据源,但是Spring3为其增加了value属性配置,可以指定当前事务通知对应的事务管理器。

 

检查了一下Spring的changelogs,这个特性是在3.0M4版中加入的:
@Transactional supports qualifier value for choosing between multiple transaction managers

[解难]


看来,或许这是一个有用的小改进,但很可能被大家忽略了。下面是从官方文档中摘抄出来的示例配置方式,供需要的同学参考:

1、配置事务注解驱动、每个数据源对应的事务管理器,并定义“限定符”

Xml代码   
  1. <tx:annotation-driven/>  
  2.   
  3. <bean id="transactionManager1" class="org.springframework.jdbc.DataSourceTransactionManager">  
  4. ...  
  5. <qualifier value="order"/>  
  6. </bean>  
  7. <bean id="transactionManager2" class="org.springframework.jdbc.DataSourceTransactionManager">  
  8. ...  
  9. <qualifier value="account"/>  
  10. </bean>   
Xml代码    收藏代码
  1. <tx:annotation-driven/>  
  2.   
  3. <bean id="transactionManager1" class="org.springframework.jdbc.DataSourceTransactionManager">  
  4. ...  
  5. <qualifier value="order"/>  
  6. </bean>  
  7. <bean id="transactionManager2" class="org.springframework.jdbc.DataSourceTransactionManager">  
  8. ...  
  9. <qualifier value="account"/>  
  10. </bean>   
 

2、在需要事务的地方,指定“限定符”

 

 

Java代码    收藏代码
  1. public class TransactionalService {  
  2.   
  3. @Transactional("order")  
  4. public void setSomething(String name) { ... }  
  5.   
  6. @Transactional("account")  
  7. public void doSomething() { ... }  
  8. }  
Java代码    收藏代码
  1. public class TransactionalService {  
  2.   
  3. @Transactional("order")  
  4. public void setSomething(String name) { ... }  
  5.   
  6. @Transactional("account")  
  7. public void doSomething() { ... }  
  8. }  
 


3、如果不指定“限定符”,将默认使用“transationManager”命名对应的事务管理器

Java代码    收藏代码
  1. The default <tx:annotation-driven> target bean name transactionManager will still be used if no specifically qualified PlatformTransactionManager bean is found  
Java代码    收藏代码
  1. The default <tx:annotation-driven> target bean name transactionManager will still be used if no specifically qualified PlatformTransactionManager bean is found  
 

  

 

你可能感兴趣的:(JUnit4,spring3多个事务管理器)