從Spring的幾個階段理解其工做過程

 

 

Spring框架很是強大,想要完全弄懂Spring是很是困難的。web

爲了便於瞭解Spring的工做原理,咱們來研究一下,Spring是怎麼加載的,Spring會通過幾個階段。spring

咱們站在Javaweb的角度將Spring分爲若干階段進行分析,以便加深咱們對Spring的理解。spring-mvc

Spring的運行大體分能夠爲三個階段:配置階段、初始化階段和運行時階段。mvc

圖解

咱們經過下圖來了解下Spring的幾個階段。app

 

配置階段

這裏咱們以JavaWeb項目爲例,當你建立一個Spring項目後,假如你要啓動這個項目,你首先要作什麼?確定是要先配置。框架

咱們首先會找到web.xml文件,在web.xml裏引入Spring容器、請求分發器的配置,由於web.xml是整個web項目的入口。async

 

<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映射。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()方法將會被映射到HandlerMappingspa

handlerMapping.put("/info/findInfoByType","InfoController.selectByInfoType(String infoType)");

 

運行時階段

處理URL請求,經過DispatchServlet分發器,從HandlerMapping找到對應的類的方法,並使用反射機制將用戶的請求分發到對應的Controller的對應方法進行處理,而後將處理結果返回給用戶。code

 

String method = handlerMapping.get("/info/findInfoByType");
//找到對應方法後,利用反射機制調用方法

結語 

這裏經過圖解方式幫助理解Spring的運行原理,只是粗略的進行分析,實際的執行過程比這複雜的多的多。有興趣的同窗能夠閱讀源碼或查閱資料瞭解更多。

相關文章
相關標籤/搜索