通过@import 和@ContextConfiguration 对配置进行分组有什么区别?
What is the difference between grouping config via @import and @ContextConfiguration.?
下面两种加载配置的方式有什么区别
两个独立的配置class在测试中通过@ContextConfiguration加载class。
将一个配置导入另一个配置并将单个配置加载到测试中的@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 的作者)
下面两种加载配置的方式有什么区别
两个独立的配置class在测试中通过@ContextConfiguration加载class。
将一个配置导入另一个配置并将单个配置加载到测试中的@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 的作者)