????????擴展AbstractAnnotationConfigDispatcherServletInitializer的任意類都會自動地配置DispatcherServlet和Spring應(yīng)用上下文,Spring的應(yīng)用上下文會位于應(yīng)用程序的Servlet上下文之中炫彩。(或者擴展WebApplicationInitializer的其余子類亦可)
????????在Servlet 3.0環(huán)境中责蝠,容器會在類路徑中查找實現(xiàn)javax.servlet.ServletContainerInitializer接口的類摊求,如果能發(fā)現(xiàn)的話隙轻,就會用它來配置Servlet容器(作用與web.xml很像)庞钢。
????????Spring提供了這個接口的實現(xiàn)访锻,名為SpringServletContainerInitializer褪尝,這個類反過來又會查找實現(xiàn)WebApplicationInitializer的類并將配置的任務(wù)交給它們來完成。Spring 3.2引入了一個便利的WebApplicationInitializer基礎(chǔ)實現(xiàn)期犬,也就是AbstractAnnotationConfigDispatcherServletInitializer因為我們的SpittrWebAppInitializer擴展了AbstractAnnotationConfigDispatcherServletInitializer(同時也就實現(xiàn)了WebApplicationInitializer)河哑,因此當部署到Servlet 3.0容器中的時候,容器會自動發(fā)現(xiàn)它龟虎,并用它來配置Servlet上下文璃谨。
? ? (注:@HandlesTypes可以把指定的類和它的子類作為參數(shù)傳入ServletContainerInitializer的onStartUp()方法中)
盡管它的名字很長,但是AbstractAnnotationConfigDispatcherServletInitializer使用起來很簡便鲤妥。在上述程序中睬罗,SpittrWebAppInitializer重寫了三個方法。
????????第一個方法是getServletMappings()旭斥,它會將一個或多個路徑映射到DispatcherServlet上容达。在本例中,它映射的是“/”垂券,這表示它會是應(yīng)用的默認Servlet花盐。它會處理進入應(yīng)用的所有請求。
????????為了理解其他的兩個方法菇爪,我們首先要理解DispatcherServlet和一個Servlet監(jiān)聽器(也就是ContextLoaderListener)的關(guān)系算芯。
????兩個應(yīng)用上下文之間的故事:
????當DispatcherServlet啟動的時候,它會創(chuàng)建Spring應(yīng)用上下文凳宙,并加載配置文件或配置類中所聲明的bean熙揍。在上述程序的getServletConfigClasses()方法中,我們要求DispatcherServlet加載應(yīng)用上下文時氏涩,使用定義在WebConfig配置類(使用Java配置)中的bean届囚。但是在Spring Web應(yīng)用中有梆,通常還會有另外一個應(yīng)用上下文。另外的這個應(yīng)用上下文是由ContextLoaderListener創(chuàng)建的意系。我們希望DispatcherServlet加載包含Web組件的bean泥耀,如控制器、視圖解析器以及處理器映射蛔添,而ContextLoaderListener要加載應(yīng)用中的其他bean痰催。這些bean通常是驅(qū)動應(yīng)用后端的中間層和數(shù)據(jù)層組件。
????????實際上迎瞧,AbstractAnnotationConfigDispatcherServletInitializer會同時創(chuàng)建DispatcherServlet和ContextLoaderListener夸溶。
????????getServletConfigClasses()方法返回的帶有@Configuration注解的類將會用來定義DispatcherServlet應(yīng)用上下文中的bean。
????????getRootConfigClasses()方法返回的帶有@Configuration注解的類將會用來配置ContextLoaderListener創(chuàng)建的應(yīng)用上下文中的bean凶硅。
????????在本例中缝裁,根配置定義在RootConfig中,DispatcherServlet的配置聲明在WebConfig中咏尝。往下我們將會看到這兩個類的內(nèi)容压语。
需要注意的是啸罢,通過AbstractAnnotationConfigDispatcherServletInitializer來配置DispatcherServlet是傳統(tǒng)web.xml方式的替代方案编检。如果按照這種方式配置DispatcherServlet,而不是使用web.xml的話扰才,那唯一問題在于它只能部署到支持Servlet 3.0的服務(wù)器中才能正常工作允懂,如Tomcat 7或更高版本。
????????使用@EnableWebMvc啟用Spring MVC(使用<mvc:annotation-driven>啟用注解驅(qū)動的
Spring MVC)衩匣。
????????WebConfig類還擴展了WebMvcConfigurerAdapter并重寫了configureDefaultServletHandling()方法蕾总。通過調(diào)用DefaultServletHandlerConfigurer的enable()方法,我們要求DispatcherServlet將對靜態(tài)資源的請求轉(zhuǎn)發(fā)到Servlet容器中默認的Servlet上琅捏,而不是使用DispatcherServlet本身來處理此類請求生百。