Spring Web MVC框架(七) 基于代码的容器初始化

2022-05-05 19:46:44 浏览数 (1)

前面我们的Spring项目都是使用XML文件配置的,包括web.xml和Spring配置文件。Spring还支持基于代码的配置,这样我们的Spring程序就可以脱离web.xml文件,全部使用代码来配置。

WebApplicationInitializer接口

第一个接口就是org.springframework.web.WebApplicationInitializer,我们实现该接口,然后在onStartup方法中就可以使用代码来配置Servlet容器和DispatcherServlet了。

代码语言:javascript复制
import org.springframework.web.WebApplicationInitializer;

public class MyWebApplicationInitializer implements WebApplicationInitializer {

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

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

}

WebApplicationInitializer是Spring提供的一个接口,Spring会确保在Servlet容器初始化的时候该接口被自动检测和使用。

AbstractDispatcherServletInitializer基类

前面介绍的WebApplicationInitializer接口是最基本的一个接口,所有的初始化代码都要在接口中实现,比较麻烦。Spring因此提供了一个实现了WebApplicationInitializer接口的基类AbstractDispatcherServletInitializer,使用它我们可以非常方便的配置Servlet容器。需要异步支持的话,如果实现WebApplicationInitializer接口的话需要手动设置异步支持标志位,就像web.xml那样;如果使用AbstractDispatcherServletInitializer基类的话不需要设置,Spring已经默认支持异步处理了。

使用Java配置

如果我们使用Java代码配置Spring的话可以继承AbstractAnnotationConfigDispatcherServletInitializer基类,然后实现其中的三个方法。

代码语言:javascript复制
public class MyAnnotationWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{RootApplicationContextConfig.class};
    }

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

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

使用XML配置

如果我们使用传统XML方式配置Spring,那么就直接继承AbstractDispatcherServletInitializer基类,然后实现其中的三个方法。

代码语言:javascript复制
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        XmlWebApplicationContext cxt = new XmlWebApplicationContext();
        cxt.setConfigLocation("/WEB-INF/applicationContext.xml");
        return cxt;
    }

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

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

}

过滤器配置

AbstractDispatcherServletInitializer提供了一个方法用于配置过滤器,只需要重写getServletFilters()方法即可。

代码语言:javascript复制
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    // ...

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] { new CharacterEncodingFilter() };
    }

}

0 人点赞