@Transactional导致@Inject字段改变

时间:2013-10-21 20:58:47

标签: spring dependency-injection transactions spring-transactions

我遇到了一个非常奇怪的问题,有一个jUnit测试和bean代理。作为测试的一部分,我手动将bean添加到应用程序上下文中,并使用AutowireCapableBeanFactory.autowire()强制bean重新连接以强制进行自动线更新。

如果我在jUnit测试中放置一个断点并检查我自动更新的bean,我可以看到我的字段已经正确更新,并包含我以编程方式添加到上下文中的新bean。

但是,当执行移动到实际的bean并在我正在测试的方法中放置断点时,我添加到上下文中的bean不会出现。

My Bean-under-test方法使用@Transactional进行注释。如果我删除@Transactional注释,则会自动更新autowire字段。

我尝试将@Transaction添加到我的jUnit测试方法中,但它没有任何影响。

Junit(实现BeanDefinitionRegistryPostProcessor):

@Test
@Rollback
@Transactional
public void testExecuteSinglePatch() throws Exception {
    GenericBeanDefinition definition = new GenericBeanDefinition();
    definition.setBeanClass(Patch1.class);
    definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
    definition.setLazyInit(false);
    registry.registerBeanDefinition("PATCH_1", definition);

    applicationContext.getBeansOfType(Patch.class);
    // reinit the patchEngine
    autowireBeanFactory.autowireBean(patchEngine);
    patchEngine.execute();

    assertEquals(1, patchRepository.findByName( new Patch1().getName()).size() );
}

受测试的Bean(PatchEngine):

@Inject private Map<String, Patch> availablePatches;

@Transactional
public void execute() throws Exception{

    // loop over all the pending patches, and apply them.  Keep looping over while patches exist and at least one patch is applied per iteration
    boolean appliedPatch = true;
    while( !availablePatches.isEmpty() && appliedPatch ){
        // no applied patches this iteration yet
        appliedPatch = false;

        // do some logic here
    }
}

当我将调试上下文设置为jUnit测试并检查patchEngine时,patchEngine.availablePatches的bean id与我将调试上下文设置为patchEngine.execute方法时找到的bean id不同。

但是,如果我从@transactional方法中删除execute()注释,那么ID就是相同的。

任何人都可以帮我理解发生了什么吗?为什么@Transactional会影响依赖注入? @Transactional如何影响代理以及如何确保代理正确填充?注释是否会导致使用不同的上下文?有没有办法解决这个问题?

我正在使用Spring 3.2.4.RELEASE和jUnit 4.11。这可能是一个Spring bug吗?

0 个答案:

没有答案