4

一般的な Bean を含む抽象 Spring 構成クラスがあります。

public abstract class AbstractConfig {
    @Bean
    public CommonBean commonBean {
        CommonBean commonBean = new CommonBean();
        commonBean.specifics = getSpecifics();
    };

    public abstract String getSpecifics();
}

一般的な Bean の詳細は、そのサブクラスによって設定されます。

package realPackage;
@Configuration
public class RealConfig extends AbstractConfig {
    @Override
    public String getSpecifics() {
        return "real";
    }
}

...と...

package testPackage;
@Configuration
@ComponentScan(basePackages = {"testPackage", "realPackage" })
public class TestConfig extends AbstractConfig {
    @Override
    public String getSpecifics() {
        return "test";
    }
}

私のテストは のみを使用する必要がありTestConfig、 について知る必要はありませんRealConfig(ただし、 内の他のコンポーネントにアクセスする必要がありますrealPackage)。始まります:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class MyIntegrationTestIT { //... }

上記のコードでは、これは期待どおりに機能し、"test"仕様を使用しています。しかし、 内のパッケージの順序を逆にすると、@ComponentScan代わり"real"に詳細が使用されます。これは私を困惑させています-これでTestConfigオーバーライドされたメソッドを呼び出す必要があることを指定していますか? Spring がこれを行う理由と、それをどのように解決できるかについて、だれかアドバイスしてもらえますか?

4

2 に答える 2

1

現在の例はおそらくコンパイルされません。AbstractConfig はこのコード スニペットのように見えるはずですが、これは単なるコピー/貼り付けエラーだと思います。

public abstract class AbstractConfig {
    @Bean
    public CommonBean commonBean() {
        CommonBean commonBean = new CommonBean();
        commonBean.specifics = getSpecifics();
        return commonBean;
    }

    public abstract String getSpecifics();
}

探している機能は @Profile アノテーションです (詳細については、https: //spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile を参照してください)。次のようにコードを変更する必要があります

RealConfig

package realPackage;
@Configuration
@Profile("real")
public class RealConfig extends AbstractConfig {
...

TestConfig

package testPackage;
@Configuration
@ComponentScan(basePackages = {"testPackage", "realPackage" })
@Profile("test")
public class TestConfig extends AbstractConfig {

MyIntegrationTestIT

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
@ActiveProfiles("test")
public class MyIntegrationTestIT {
...
于 2015-07-27T12:30:07.890 に答える