gpt4 book ai didi

java - @Autowired 覆盖@Bean

转载 作者:行者123 更新时间:2023-12-02 02:46:25 24 4
gpt4 key购买 nike

我遇到了一个奇怪的问题(或者可能只是对 Spring 4.1.7 的一些误解):

有一个组件,我们称之为 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 正确初始化,但随后 Spring 注入(inject)“正常hibernateTemplate 进入它(这是错误的)。

我尝试显式地将 autowire = Autowire.NO 添加到 @Bean 定义中,即使这已经是默认值...而且也没有两个 myComponent bean,它总是相同的一个...

有谁知道为什么会发生这种情况,如果是的话,如何预防?我一直以为当涉及@Bean时,@Autowired不会覆盖它?

请注意:因为MyComponent也在其他项目中使用,所以我绝对不能碰它。我无法删除 @Autowired ,也无法添加 @Qualifier 或类似内容,因为这会破坏许多其他项目。通常,它工作得很好,因为它使用“主”(通常是唯一)数据库连接。就在这个模块中,另一个数据库应该是主要数据库,因此需要告诉 MyComponents 使用辅助数据库。

最佳答案

你不能在 BaseComponent 中使用 @Qualifier("hibernateTemplateSecondary") 以便它可以选取正确的 bean 吗?

@Autowired
@Qualifier("hibernateTemplateSecondary")
private HibernateTemplate hibernateTemplate;

另一种方法是使用主要注释,这在您的情况下看起来不太好(考虑到它是您的辅助 bean)

@Bean 
@Primary
public HibernateTemplate hibernateTemplateSecondary() { ... create another one ... }

关于java - @Autowired 覆盖@Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44513676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com