XmlWebApplicationContext、AnnotationConfigWebApplicationContext 和 GenericWebApplicationContext 之间有什么区别

What is the difference between XmlWebApplicationContext, AnnotationConfigWebApplicationContext, and GenericWebApplicationContext

我正在使用 TestNG 和 spring-test 编写单元测试,它通过 @ContextConfiguration 加载 xml 上下文并通过 @WebAppConfiguration 加载调度程序 servlet。我有一个像 blow 的 class 获取上下文并打印上下文类型。

@Component
public class ApplicationContextInitializer implements ApplicationContextAware {


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextInitializer.applicationContext = applicationContext;
        if (applicationContext instanceof AnnotationConfigApplicationContext) {
            System.out.println("1");
        }

        if (applicationContext instanceof GenericWebApplicationContext) {
            System.out.println("3");
        }

        if (applicationContext instanceof GenericXmlApplicationContext) {
            System.out.println("4");
        }

        if (applicationContext instanceof ResourceAdapterApplicationContext) {
            System.out.println("5");
        }

        if (applicationContext instanceof StaticApplicationContext) {
            System.out.println("6");
        }

        if (applicationContext instanceof XmlWebApplicationContext) {
            System.out.println("7");
        }

        if (applicationContext instanceof AnnotationConfigWebApplicationContext) {
            System.out.println("8");
        }
    }
}

测试class:

@ContextConfiguration(value = "classpath:integration-context-test.xml")
@TestPropertySource(locations = {"classpath:temp.properties"})
@WebAppConfiguration
public class TaskTest extends AbstractTransactionalTestNGSpringContextTests {}

为什么控制台打印"3",显示是GenericWebApplicationContext? return 什么时候会提到另外两种类型?使用 TestNG 时是否可以将 XmlWebApplicationContext 写成 ApplicationContextInitializer class?

Why the console prints "3", showing that it is GenericWebApplicationContext?

在使用 Spring TestContext Framework 的集成测试中,如果您注释测试 [=45],ApplicationContextGenericWebApplicationContext =] 与 @WebAppConfiguration。否则,它将是 GenericApplicationContext.

集成测试的 ApplicationContextContextLoader 加载。在您的示例中,具体实现是 GenericXmlWebContextLoader。那是因为您为 XML 配置文件指定了 locations

When will it return two other types mentioned?

在集成测试中,它不会 return 您提到的其他类型,因为 Spring TestContext Framework[=43] 中的所有 ContextLoader 实现=] 创建 GenericApplicationContextGenericWebApplicationContext.

Is it possible to get XmlWebApplicationContext in written ApplicationContextInitializer class while using TestNG?

不,不在测试中。

但您通常不需要依赖它作为 XmlWebApplicationContext。知道它是 ConfigurableWebApplicationContext(因此是 WebApplicationContext)通常在生产代码和测试中都足够了。