通过@import 和@ContextConfiguration 对配置进行分组有什么区别?

What is the difference between grouping config via @import and @ContextConfiguration.?

下面两种加载配置的方式有什么区别

  1. 两个独立的配置class在测试中通过@ContextConfiguration加载class。

  2. 将一个配置导入另一个配置并将单个配置加载到测试中的@ContextConfiguration class。

我认为两者都将配置推送到公共池中。但我看到了不同之处。我有两个全局拦截器,一个在 java.config 中,另一个在 xml.config 中。如果我按照上面的第二种方法,两个拦截器都在加载。

但如果我采用第一种方法,则只有一个拦截器正在加载,这取决于我是在调用基于 xml 的网关还是基于 java 的网关。

https://github.com/manojp1988/Learning/tree/JavaDSL/Sample1

@RunWith(SpringJUnit4ClassRunner.class)
@ContextHierarchy({
 @ContextConfiguration(locations = {"/applicationContext.xml"}),
 @ContextConfiguration(classes = SpringConfiguration.class),
 })
public class SampleTest {}

更新:

@Bean
  @GlobalChannelInterceptor(patterns = "*_EL*", order=3)
  public WireTap wireTap() {

如果您遵循方法 #1,两个拦截器实际上都在加载...只是在 不同 ApplicationContexts 中。

@ContextHierarchy 指示 Spring TestContext Framework 加载上下文的 hierarchy

因此,您拥有的两个配置设置在上下文方面并不相同。当您使用 @ContextHierarchy 时,XML 组件只能看到 XML ApplicationContext 中定义的其他 beans(即层次结构的顶层);而 Java DSL 组件可以看到所有组件(即在 Java Config 中配置的组件和 在 XML 中配置的组件,因为 XML 上下文是 Java 配置上下文的 父级

相信这就是你想要的...

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class SampleTest { /* ... */ }
@Configuration
@ComponentScan(basePackages = "com.model")
@EnableIntegration
@IntegrationComponentScan
@ImportResource("/applicationContext.xml")
public class SpringConfiguration { /* ... */ }

如果您不想 SpringConfiguration 导入 XML 配置,您也可以使用以下方法实现相同的行为:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class SampleTest {

    @Configuration
    @Import(SpringConfiguration.class)
    @ImportResource("/applicationContext.xml")
    static class Config {}

/* ... */

}

此致,

Sam(Spring TestContext Framework 的作者)