從Spring的幾個階段理解其工作過程
Spring框架非常強大,想要徹底弄懂Spring是非常困難的。
為了便於瞭解Spring的工作原理,我們來研究一下,Spring是怎麼載入的,Spring會經過幾個階段。
我們站在Javaweb的角度將Spring分為若干階段進行分析,以便加深我們對Spring的理解。
Spring的執行大致分可以為三個階段:配置階段、初始化階段和執行時階段。
圖解
我們通過下圖來了解下Spring的幾個階段。
配置階段
這裡我們以JavaWeb專案為例,當你建立一個Spring專案後,假如你要啟動這個專案,你首先要做什麼?肯定是要先配置。
我們首先會找到web.xml檔案,在web.xml裡引入Spring容器、請求分發器的配置,因為web.xml是整個web專案的入口。
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
初始化階段
配置完畢後,啟動專案時,由web容器自動呼叫servlet的初始化方法。ContextLoaderListener會從指定的配置檔案讀取配置資訊,將所需要載入的bean初始化並載入到Spring IOC容器,並針對引入@Autowrited註解或通過配置檔案宣告依賴關係的的bean進行依賴注入和自動裝配。然後會初始化HandlerMapping,將帶有@Controller註解的bean通過ResultMapping註解的value與方法名繫結,進行URL對映。
@Controller @RequestMapping("/info") public class InfoController { /** * 按資訊型別查詢公共資訊 * @param infoType 資訊型別 * @return */ @RequestMapping("findInfoByType") @ResponseBody public Map<String, Object> selectByInfoType(String infoType){ //... return result; } }
舉個例子,我們看上面這個Controller類,首先類上加了@Controller註解,以及@ResultMapping("/info")註解。selectByInfoType()方法上有@ResultMapping("/findInfoByType")註解。所以當Spring初始化時,註解掃描器就會掃描到該類(使用註解方式的情況下),發現該類有@ResultMapping("/info")註解,然後掃描該類下所有帶有@ResultMapping()註解的方法。如下程式碼,selectByInfoType()方法將會被對映到HandlerMapping
handlerMapping.put("/info/findInfoByType","InfoController.selectByInfoType(String infoType)");
執行時階段
處理URL請求,通過DispatchServlet分發器,從HandlerMapping找到對應的類的方法,並使用反射機制將使用者的請求分發到對應的Controller的對應方法進行處理,然後將處理結果返回給使用者。
String method = handlerMapping.get("/info/findInfoByType");
//找到對應方法後,利用反射機制呼叫方法
結語
這裡通過圖解方式幫助理解Spring的執行原理,只是粗略的進行分析,實際的執行過程比這複雜的多的多。有興趣的同學可以閱讀原始碼或查閱資料瞭解更