【问题标题】:Spring Java based Servlet container initialization (web.xml alternative) with XML config support?支持 XML 配置的基于 Spring Java 的 Servlet 容器初始化(web.xml 替代方案)?
【发布时间】:2013-11-12 03:33:33
【问题描述】:

我最近想迈出一大步,将所有内容都迁移到基于 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)的情况下实现这一目标?

【问题讨论】:

  • 我刚刚看到这个页面SpringBlog,其中 Spring Security 是基于 Java 配置的。 3个月..所以从技术上讲,我不再有这个问题了。但是对于基于 Java 的其他情况,这个问题可能很有趣。尚不支持。

标签: java xml spring servlets spring-mvc


【解决方案1】:

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

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

来自链接:

和@Import 一样,这个注解提供了类似于Spring XML 中元素的功能。它通常用于将 @Configuration 类设计为由 AnnotationConfigApplicationContext 引导,但仍然需要一些 XML 功能(例如命名空间)。

【讨论】:

    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多