SpringMVC——Servlet容器啟動時初始化SpringMVC應用的原理


 

 

在 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初始化有哪些可以配置的項,只需要查看這個類繼承體系中提供了哪些配置功能的接口即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM