通过@import和@ContextConfiguration分组配置有什么区别。

时间:2015-07-25 22:51:22

标签: spring spring-integration spring-test

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

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

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

  3. 我认为两者都将配置推送到公共池中。但我看到了一个区别。我有两个全局拦截器,一个在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 个答案:

答案 0 :(得分:3)

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

@ContextHierarchy指示 Spring TestContext Framework 加载层次结构的上下文。

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

我相信这实际上就是你想要的......

@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的作者