我最近想迈出一大步,将一切都转移到基于 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
?