以下两种加载配置的方式有什么区别。
通过测试类中的@ContextConfiguration加载两个独立的配置类。
将一个配置导入另一个配置并将该单个加载到测试类中的@ContextConfiguration。
我认为两者都将配置推送到公共池中。但我看到了一个区别。我有两个全局拦截器,一个在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() {
答案 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的作者)