
在 Servlet 3.0標准中含有一個 ServletContainerInitializer接口,所有實現了這個接口的類會在容器啟動的時候得到一個通知,並且會調用其 onStartup()方法,這個接口非常簡單,只有一個 onStratup()方法
package javax.servlet; import java.util.Set; public interface ServletContainerInitializer { void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException; }
Spring中提供了一個 SpringServletContainerInitializer類,實現了這個接口
@HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInitializer implements ServletContainerInitializer { @Override public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException { // logic } }
此處代碼省略了onStratup()方法中的邏輯。可以看到Spring中的這個類實現了 ServletContainerInitializer接口,並且這個類使用了一個 @HandlesTypes注解進行標注,這個注解也是源自於Servlet規范中,它接受一個WebApplicationInitializer類型作為參數。這表示,當容器啟動時,會到應用程序中搜索所有實現或繼承了 WebApplicationInitializer類型的類,並且將這些類作為參數傳遞給 SpringServletContainerInitializer.onStratup()方法
而在SpringServletContainerInitializer.onStratup()的邏輯中,會調用所有被傳入的 WebApplicationItializer類型的 onStartup()方法。
根據上面的類繼承體系,應該能夠很明確的看出來,我們在配置SpringMVC時所編寫的初始化類都是繼承自 AbstractAnnotationConfigDispatcherServletInitializer類,它會繼承父類的 onStartup()方法,同樣的我們的配置類也就繼承了父類的onStartup()方法,當容器啟動時,就會調用這個 onStartup()方法。
而為了簡化配置,父類中實現了一系列的配置方法,都會在 onStartup()方法中進行調用,因此我們在編寫自己的初始化類時,只需要重寫相應的配置方法即可。
因此想要知道SpringMVC初始化有哪些可以配置的項,只需要查看這個類繼承體系中提供了哪些配置功能的接口即可。
