【问题标题】:Spring @Transactional not proxying when referenced on xml在 xml 上引用时 Spring @Transactional 不代理
【发布时间】:2016-02-26 15:03:09
【问题描述】:

我正在处理一些在 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"/>

在这种情况下,我的存储库没有使用事务方面的代理。

我什至尝试只是给它起别名,但同样的事情发生了。 我目前的解决方法是实现 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;
    }
}

【问题讨论】:

  • 你如何注入BeanIAmOverriding.bean? ...因为它看起来将保持为空。
  • @Augusto 解决方法:public class BeanIAmOverriding implements BeanFactoryAware { private MyAnnotatedBean bean; }

标签: java xml spring spring-mvc


【解决方案1】:

就像我在评论中所说,问题在于您没有注入“BeanIAmOverriding.bean”,因为 spring 不知道它必须注入它!尝试以下操作(我不能 100% 确定以下操作是否有效,因为我已经很长时间没有参与混合使用“旧版”xml 和注释的项目了)。

public class BeanIAmOverriding {
    private MyAnnotatedBean bean;

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

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

我不确定您对 Spring 的体验如何,但我建议您阅读一下dependency injection 上的部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2013-12-10
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多