在xml上引用时,Spring @Transactional不代理

时间:2016-02-26 15:03:10

标签: java xml spring spring-mvc

我正在研究一些在xml上使用spring bean定义的遗留代码。 我正在构建的模块使用注释。

问题是有时候我需要覆盖遗留的bean定义,所以我也需要把我的bean放在xml上。

我有以下内容:

public class BeanIAmOverriding {
    private MyAnnotatedBean bean;
}

@Component
public class MyAnnotatedBean {
    private Repository repo;
}

@Repository
public class Repository {

    @Transational
    public Something find(...)
}

Xml文件:

<bean id="bean" class="a.b.c.BeanIAmOverriding"/>

在这种情况下,我的存储库不会被事务性aspec代理。

我甚至尝试过混淆它,但同样的事情发生了。 我目前的解决方法是implementind BeanFactoryAware。

你有更好的想法吗?

编辑: 让我澄清一下。 我确实知道依赖注入,我只是忽略了一些我认为在上下文中没有相关性的配置,但在这里它们是。

我想做点什么:

<bean id="bean" class="a.b.c.BeanIAmOverriding">
     <constructor-arg index="0" ref="myAnnotatedBean"/>
 </bean>

这不起作用。当我这样做时,我的存储库不会被事务方面代理。

所以我有这个解决方法:

public class BeanIAmOverriding implements BeanFactoryAware{
    //private MyAnnotatedBean bean;
    private BeanFactory beanFactory;

    public void something(){
    beanFactory.getBean(MyAnnotatedBean.class).doSomething();
    }

     @Override
     public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }
}

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说的那样,问题在于你并没有注入“BeanIAmOverriding.bean”,因为春天并不知道它必须注入它!请尝试以下操作(我不能100%确定以下内容是否有效,因为自从我使用混合了&#39; legacy&#39; xml的项目以来,已经有很长一段时间了。注解)。

public class BeanIAmOverriding {
    private MyAnnotatedBean bean;

    @Autowired
    public BeanIAmOverriding(MyAnnotatedBean bean) {
        this.bean = bean;
    }
}

@Autowired注释将告诉spring如何实例化该类。然后Spring将获取MyAnnotatedBean的实例并将其注入构造函数中。

我不确定您对Spring有多么有经验,但我建议您阅读dependency injection部分的内容。