Spring MVC - 理解 SpringServletContainerInitializer
SpringServletContainerInitializer类实现了 ServletContainerInitializer接口。这意味着servlet(3.0以上版本)容器启动时,该类被容器自动加载并执行其onStart方法,因为spring web模块JAR存在于类路径中。
WebApplicationInitializer
SpringServletContainerInitializer 类使用了@HandlesTypes(WebApplicationInitializer.class)
注解。表明给onStart方法传递了类路径下所有实现了WebApplicationInitializer类。spring将初始化所有这些具体实现类,并调用他们的WebApplicationInitializer#onStartup(servletContext)
方法。这些类可以自由地在onStart方法中,通过可编程方式注册和初始化servlet组件。
客户端代码能直接实现WebApplicationInitializer接口注册DispatcherServlet
类。
spring的WebApplicationInitializer抽象实现
spring也提供了WebApplicationInitializer接口的抽象实现AbstractDispatcherServletInitializer,并且AbstractAnnotationConfigDispatcherServletInitializer
类已经注册了DispatcherServlet
类,一个该抽象类的实现可以简化springmvc的注册过程。
示例代码:
public class AppInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses () {
return new Class<?>[]{MyAppConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses () {
return null;
}
@Override
protected String[] getServletMappings () {
return new String[]{"/"};
}
}