2

我正在尝试创建一个 MainConfig,它使用 @Bean 方法而不是 @Import 来导入另一个 Config,如下所示:

@Configuration
public class MainConfig {

  @Bean
  public Service service() {
    return new Service(infrastructureConfig().database());
  }

  @Bean
  public OtherService otherService() {
    return new OtherService(infrastructureConfig().database());
  }      

  @Bean
  public InfrastructureConfig intrastructureConfig() {
    return new InfrastructureConfig();
  }

}


@Configuration
public class InfrastructureConfig {

  @Bean
  public Database database() {
    return new Database();
  }

  ...
}

使用这种技术时,会创建两次数据库,因为 Spring 似乎没有考虑 InfrastructureConfig 上的 @Configuration 注解。使用@Import 时,它工作正常。

我不想使用@Import,因为我想像这样模拟我的 InfrastructureConfig:

@Configuration
public class TestConfig extends MainConfig {

  @Override
  public InfrastructureConfig infrastructureConfig() {
    return mock(InfrastructureConfig.class);
  }
}

我错过了什么还是不支持?

谢谢

4

2 回答 2

0

当我第一次尝试 Spring Java 配置时,我想我做了同样的假设,当它不起作用时我感到很惊讶。

我不确定这是解决这个问题的最佳方法,但我已经成功使用了以下方法。

要包含该 @Configuration 类,您可以将此注释添加到您的MainConfig

@ComponentScan(basePackages = "org.foo", includeFilters = {@Filter(filterType = ANNOTATION, value = CONFIGURATION)}, excludeFilters = {@Filter(filterType = ASSIGNABLE_TYPE, value = MainConfig)})

由于@Configuration 类也是组件扫描的候选对象,因此您可以扫描所有使用@Configuration 注释的类。由于您要放置此注释,因此MainConfig您需要使用 ASSIGNABLE_TYPE 过滤器排除它,因为您将获得循环引用。

于 2012-06-08T16:38:23.707 回答
0

我开了一张 Spring 票SpringSource JIRA,他们说这是一个已知的限制,它按设计工作。

于 2012-10-05T19:41:55.870 回答