简介:
纯注解开发意味着使用注解或配置类来代替web.xml和springmvc.xml配置文件
1.代替web.xml文件需实现javax.servlet.ServletContainerInitialize接口
更多关于ServletContainerInitialize接口
在spring中SpringServletContainerInitialize实现了该接口,所以tomcat启动时就会自动执行里面的onStartup()方法,下面是具体实现
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
throws ServletException {
//......省略其他......
//关键看这行代码,依次调用WebApplicationInitializer实现类的onStartup()方法
//WebApplicationInitializer说明:要在servlet 3.0环境中实现的接口,以便以编程方式配置ServletContext
for (WebApplicationInitializer initializer : initializers) {
initializer.onStartup(servletContext); //实际上调用的是各个WebApplicationInitializer实例
}
}
}
所以我们可以继承WebApplicationInitializer接口来实现相关配置,会自动被加载执行,但一般使用他的基础实现类AbstractAnnotationConfigDispatcherServletInitializer
springmvc中继承WebApplicationInitializer结构如下图:
依次对这些类作部分说明:
//最顶层接口
public interface WebApplicationInitializer {
//用于使用给定的ServletContext初始化此Web应用程序所需要的任何Servlet,Filter,和必要的Listener上下文属性(context-params)
void onStartup(ServletContext servletContext) throws ServletException;
}
public abstract class AbstractContextLoaderInitializer implements WebApplicationInitializer {
//向ServletContext注册ContextLoaderListener监听器,监听器干了什么自己可以去探究
protected void registerContextLoaderListener(ServletContext servletContext) {
WebApplicationContext rootAppContext = createRootApplicationContext();
if (rootAppContext != null) {
ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
listener.setContextInitializers(getRootApplicationContextInitializers());
servletContext.addListener(listener);
}
else {
logger.debug("No ContextLoaderListener registered, as " +