Servlet3.0之后,提供了注解,使得不需要在web.xml中进行servlet的配置。
在原web.xml中,<load-on-startup>1</load-on-startup>的作用:
1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
2)它的值必须是一个整数,表示servlet应该被载入的顺序
3)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
4)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
5)当值相同时,容器就会自己选择顺序来加载。
在基于java注解的配置中,实现WebApplicationInitializer类都可以在web应用程序启动时被加载。
WebApplicationInitializer必须通过SpringServletContailnerIntializer才能加载。
public interface WebApplicationInitializer {
void onStartup(ServletContext servletContext) throws ServletException;
}
SpringServletContainerInitializer:
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> webAppInitializerClasses,
ServletContext servletContext) throws ServletException {
List<WebApplicationInitializer> initializers =
new LinkedList<WebApplicationInitializer>();
if (webAppInitializerClasses != null) {
for (Class<?> waiClass : webAppInitializerClasses) {
if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers())
&& WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
try {
initializers.add((WebApplicationInitializer) waiClass.newInstance());
} catch (Throwable ex) {
throw new ServletException("Failed to instantiate
WebApplicationInitializer class", ex);
}
}
}
}
if (initializers.isEmpty()) {
servletContext.log("No Spring WebApplicationInitializer types
detected on classpath");
return;
}
servletContext.log(initializers.size() + " Spring WebApplicationInitializers
detected on classpath");
AnnotationAwareOrderComparator.sort(initializers);
for (WebApplicationInitializer initializer : initializers) {
initializer.onStartup(servletContext);
}
}
}
注:
1.要实现ServletContainerInitializer接口,必须指定实现的类。@HandlesTypes就起到关键性作用。
2.在spring-web-x.x.x..RELEASE.jar中META-INF/services/javax.servlet.ServletContainerInitializer里面的内容必须是实现ServletContainerInitializer的类。
javax.servlet.ServletContainerInitializer:
org.springframework.web.SpringServletContainerInitializer
ServletContainerIntializer:
public interface ServletContainerInitializer {
void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
}