我使用的是Spring 4.1.2。 Junit 4和带有DirtiesContext的SpringJUnit4ClassRunner。
在Spring破坏旧的上下文并创建新的上下文后,我可以看到所有的bean都是新的。但它们由相同的AnnotationTransactionAspect类代理。有趣的是那些AnnotationTransactionAspect-s(TransactionAspectSupport)有一个新的beanFactory!但同时他们有旧的transactionManagerCache-s来缓存前一次测试中的旧连接(并且在第一次测试结束时关闭弹簧后这些连接已经关闭)。 为什么Spring不会创建新的AnnotationTransactionAspects?
P.S。从Spring 3.X迁移到4.X后,我似乎开始面临这个问题。
答案 0 :(得分:1)
这是Spring的一个错误。 https://jira.spring.io/browse/SPR-12518已在4.1.4
中修复答案 1 :(得分:0)
我没有得到如何修复AnnotationTransactionCreation。我做了一个黑客。 为PlatformTransactionManager创建代理
public class TestTransactionManager implements PlatformTransactionManager {
private static List<TestTransactionManager> transactionManagerList = new ArrayList<>();
private PlatformTransactionManager transactionManager;
public void init() {
transactionManagerList.add(this);
for (TestTransactionManager m : transactionManagerList) {
m.setTransactionManager(transactionManager);
}
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
@Override
public TransactionStatus getTransaction(TransactionDefinition transactionDefinition) throws TransactionException {
return transactionManager.getTransaction(transactionDefinition);
}
@Override
public void commit(TransactionStatus transactionStatus) throws TransactionException {
transactionManager.commit(transactionStatus);
}
@Override
public void rollback(TransactionStatus transactionStatus) throws TransactionException {
transactionManager.rollback(transactionStatus);
}
}
并将其放入测试应用程序上下文
<bean id="testTransactionManager" class="ru.bpc.core.integration.stub.TestTransactionManager" init-method="init">
<property name="transactionManager" ref="transactionManager"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="testTransactionManager"/>