基于Spring Java的Servlet容器初始化(web.xml替代),支持XML配置?

时间:2013-10-31 23:11:05

标签: java xml spring servlets spring-mvc

我最近想要迈出一大步,将所有内容都转移到基于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的配置文件,所以我使用AbstractAnnotationConfigDispatcherServletInitializer的2. case。但我有一个XML文件(对于Spring Security),我真的想注册,而不更改我的抽象类。对于这种情况,接口WebApplicationInitializer(1. case)是目前唯一的解决方案(或者可以是解决方案)?或者是否有另一种方法可以在不使用1.案例或不创建2 WebApplicationInitializer个类(1个AbstractAnnotationConfigDispatcherServletInitializer和1个AbstractDispatcherServletInitializer)的情况下实现此目的?

1 个答案:

答案 0 :(得分:3)

在示例2中,您可以MyWebConfig(该类本身,您知道,@Configuration在......处注明了@ImportResource

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

从链接:

  

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