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

3
下面是两种加载配置的方式之间的区别:
  1. 测试类中通过@ContextConfiguration加载两个独立的配置类。

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

我认为这两种方式都会将配置推送到公共池中。但是,我发现了一个区别。我有两个全局拦截器,一个在java.config中,另一个在xml.config中。如果我采用上述第2种方法,则两个拦截器都会加载。
但是,如果我采用第1种方法,则只有一个拦截器会加载,具体取决于我是调用基于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个回答

3
如果按照第一种方法进行,两个拦截器实际上都被加载了……只是在不同的ApplicationContexts中。@ContextHierarchy指导Spring TestContext Framework加载一系列的上下文。

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

我相信这实际上就是你想要的……
@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的作者


谢谢你,Sam。但如果你说我的类中的Java配置知道XML和Java的配置,那么当我调用hello.sayHello("Manoj")时为什么XML拦截器没有起作用呢?从Java配置加载的上下文应该同时具有XML配置和Java配置,对吗? - Manoj
因此,仅通过在@contextheirarchy中定义配置,我们不能期望它们都在单个上下文中加载。我们需要将一个配置导入到另一个配置中。我在应用程序中需要多个上下文的目的是什么? - Manoj
你可能会发现参考手册中的“混合使用XML、Groovy脚本和注释类”一节非常有启发性。链接 - Sam Brannen
如果您对我的回答感到满意,我会非常感激您的“接受”。 ;) - Sam Brannen
我还有一个疑问,如果您在上面更新的问题部分中看到,我正在新的applicationContext中加载拦截器配置。我可以在子上下文中将wiretap作为bean访问,但是我无法在子上下文中使用@GlobalInterceptor。所以子上下文只继承父级的bean?同一项目中的Github文件: /Sample1/src/main/java/com/config/DSLInterceptor.java /Sample1/src/main/java/com/config/SpringConfiguration.java /Sample1/src/test/java/com/sample/SampleTest.java - Manoj
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接