2

次のように @Import の代わりに @Bean メソッドを使用して、別の構成をインポートする MainConfig を作成しようとしています。

@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 アノテーションを考慮していないように見えるため、データベースが 2 回作成されます。@Import を使用すると、正常に動作します。

次のように InfrastructureConfig をモックしたいので、 @I​​mport を使用したくありません。

@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 に答える