我正在研究一些在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;
}
}
答案 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部分的内容。