Spring WebApplicationInitializer

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;
}

猜你喜欢

转载自z724130632.iteye.com/blog/2373735