【问题标题】:Override bean definition in java config覆盖java配置中的bean定义
【发布时间】:2021-06-26 04:47:09
【问题描述】:

我有一个配置类

@Configuration
public class FooConfig{
  @Bean
  public FooService fooService() { ... }
  @Bean
  public AbcService abcService() { ... }
}

该类是在我无法更改的库中定义的。我有一个项目,在很多地方都使用了FooService。在我的项目中,我有另一个配置类

@Configuration
@Import({
  FooConfig.class,
   
})
public class BarConfig{
  @Autowired AbcService abc;
  ...    
}

这里使用AbcService,因为有些服务依赖于该服务,并且这些服务在BarConfig 中声明。但是这里没有使用FooService(它只在控制器中使用)

我需要更改FooService 的实现。我可以在BarConfig 中定义新的FooService bean 吗?它会覆盖通过FooConfig 导入的现有定义吗?

【问题讨论】:

  • 你能继承FooConfig,然后不在你的上下文扫描中包含它吗?
  • 这是个坏主意,仅适用于一种情况的特殊挂钩。我建议BarConfig 作为根配置类
  • 我的意思是BarConfig extends FooConfig 有一个覆盖方法。 (或者你自己的 MyFooConfig 并导入它。)
  • 我的意思是BarConfig extends FooConfig 是个坏主意。如果我有几个这样的FooConfig 怎么办?

标签: java spring


【解决方案1】:

您可以多次重新定义同一个 bean 名称,spring 容器将采用为给定名称处理的最后一个 bean 定义作为获胜者。 在您的情况下,由于包含您无法更改的配置的核心项目不依赖于您在项目中定义的任何 bean,因此如果您重新定义 FooService bean. 它将正常工作 之前有很多关于如何覆盖bean定义的答案,你可以看看有更多的信息。

【讨论】:

  • 我无法更改FooConfig。那里定义的FooService bean 的 id 是什么?它没有明确指定。如果我知道 id,我将能够按照您的描述覆盖它
  • 使用基于 java 的配置,带有 @Bean 注释的方法名称用作 bean ID。在您的情况下,fooService 将承担 id 的角色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
相关资源
最近更新 更多