我有一个奇怪的问题(或者只是关于Spring 4.1.7一些误解):@Autowired覆盖@Bean
有一个组件,让我们把它叫做myComponent的,看起来像这样...
@Component
public class MyComponent extends BaseComponent {
...
}
BaseComponent是这样的......
public class BaseComponent {
@Autowired
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
}
虽然类与@Component注解由于历史原因,部分扫描是不是这个包激活,因此该组件将不会自动找到。因此,我有我的@Configuration定义...
@Configuration
public class MyConfiguration {
@Bean
public HibernateTemplate hibernateTemplate() { ... create one ... }
@Bean
public HibernateTemplate hibernateTemplateSecondary() { ... create another one ... }
@Bean
public MyComponent myComponent() {
MyComponent component = new MyComponent();
component.setHibernateTemplate(hibernateTemplateSecondary());
return component;
}
}
不幸的是,现在情况是,myComponent的将首先正确地与二次HibernateTemplate
初始化,但事后,春天注入了“正常” hibernateTemplate
进入它(这是错误的)。
我试图明确添加autowire = Autowire.NO
到@Bean定义,即使这已经是默认......也没有两个myComponent的豆子,它总是同一个...
有没有人一个想法为什么发生这种情况,如果是的话,如何防止它呢?我一直认为@Bean参与时,@Autowired不会覆盖那个?
请注意:因为MyComponent
也用于其他项目,所以我绝对不能碰它。我无法删除@Autowired
,我也不能添加@Qualifier
或类似的东西,因为那会破坏很多其他项目。通常情况下,它工作正常,因为它使用“主要”(通常是唯一的)数据库连接。就在这个模块中,另一个数据库应该是主数据库,因此需要告知MyComponents
使用次数据库。
为什么不简单地删除'@ Autowired'? – Henry
不能这样做,因为'MyComponent'被用于许多其他模块,它被组件扫描。就在这个模块中,它不应该是(因为这个模块使用了不同的“主”数据库)。 –
为了理解你的问题,第一次在hibernateTemplate变量中用hibernateTemplate对象从hibernateTemplateSecondary()方法和后来的hibernateTemplate变量绑定到BaseComponent中,用hibernateTemplate()方法用hibernateTemplate覆盖最初的hibernateTemplate变量。这是你的观点吗? –