3

我最近想迈出一大步,将一切都转移到基于 Java 的配置中。到目前为止工作完美。只有一个问题。

Spring 有这个 WebApplicationInitializer 接口,它实际上是第一个 web.xml 替代 AFAIK:

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        XmlWebApplicationContext appContext = new XmlWebApplicationContext();
        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }
}

更好的是,有一个非常棒的 AbstractAnnotationConfigDispatcherServletInitializer 类,如果您的配置文件(Dispatcher 等)都是基于 Java 的,那么使用它会更加完美:

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { MyWebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

还有一个 XML 版本,如果您的调度程序仍然停留在 xml 中:

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

    @Override
    protected WebApplicationContext createServletApplicationContext() {
        XmlWebApplicationContext cxt = new XmlWebApplicationContext();
        cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
        return cxt;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

现在我的问题是:我主要有基于 java 的配置文件,所以我使用 2. case with AbstractAnnotationConfigDispatcherServletInitializer. 但是我有一个 XML 文件(用于 Spring Security),我真的很想注册它,而无需更改我的抽象类。对于这种情况,接口WebApplicationInitializer(1.case)是目前唯一的解决方案(或者可以是解决方案)?WebApplicationInitializer或者是否有另一种方法可以在不使用 1. 案例或不创建 2 个类(1 个AbstractAnnotationConfigDispatcherServletInitializer和 1 个)的情况下实现这一点AbstractDispatcherServletInitializer

4

1 回答 1

3

在示例 2 中,您可以MyWebConfig(类本身,您知道,您@Configuration在哪里...)用@ImportResource.

@ImportResource是一种指定要从 Java 配置导入的 xml 配置的方法。这是混合 Java 和 xml 配置的主要方法之一。

从链接:

与 @Import 一样,此注解提供类似于 Spring XML 中的元素的功能。它通常在设计 @Configuration 类以由 AnnotationConfigApplicationContext 引导时使用,但仍然需要一些 XML 功能,例如命名空间。

于 2013-11-01T01:30:20.157 回答