標籤:

Spring AOP,IOC,MVC的基本原理

Spring這個框架,我相信所有的java開發者都會用到,這篇文章將給大家講一講,他的核心模塊中的三個模塊的基本原理,當然了,只是基本原理,那些關於程序健壯性的判斷和處理 以及 一些比較深入的點 就不細說了。

IOC的原理

不管是IOC還是AOP,他們都是從一個監聽器開始的,這個監聽器在web.xml里進行配置的,我相信所有用過spring的人,都配過。在容器啟動的時候,會自動執行這個監聽器,如下圖:

IOC的整個流程 基本由四大塊組成:

1、 掃描指定的包以及子包的所有類

在spring的配置文件中,有一個下圖所示的節點

1.1、 在容器啟動的時候,監聽器會讀取配置文件,獲取到這個節點的base-package屬性的值, 根據這個值的包名,去掃描包下面的所有的類以及所有子包的類,

1.2、 這個類獲取到之後,會判斷他是否有Service之類的註解,如果有的話,會將註解中的name名稱以及類的全名存放到servletcontext中

2、 讀取配置文件的所有bean節點

同樣,監聽器也會去讀取配置文件中所有的bean節點,獲取到ID值,class值 以及bean節點下的所有屬性注入的配置,並存到servletcontext中

3、 創建bean對象

當完成上面兩步之後,會將存進去的數據讀取出來,進行迭代,在迭代的過程中進行bean對象的創建,創建過程中會讀取配置文件中的關於AOP的節點,根據節點的配置判斷,這個類是不是需要進行動態代理,如果是則從動態代理創建對象,如果不是 則直接通過反射new一個對象。當對象創建完成之後,會將 ID,對象,bean節點下的屬性注入配置 一起存入servletcontext中

4、 往bean對象的成員變數中注入值

上面的三步完成之後,會將第三步存進servletcontext的數據讀取出來,進行迭代,在迭代的過程中,通過反射獲取到對象的成員變數,並判斷是否有resource,autowrite之類的註解,如果有,則根據註解 去servletcontext中查詢合適的對象,通過反射進行賦值。同時,判斷此次迭代的這個對象 是否存在 屬性注入的配置,如果存在,則根據配置的中的name去查找對象中的成員變數,根據配置的ref去 servletcontext中查詢合適的對象,通過反射進行賦值。如果ref的值是空的,則取value屬性的值直接賦值。

AOP的原理

AOP的基本原理比較簡單,Spring使用的cglib的動態代理,在創建bean的過程中進行綁定的。 在方法執行的過程中,根據配置文件來判斷,這個方法是否是被監聽過的,如果不是,則不執行 方法前後那段的邏輯,直接執行本方法即可,如果是,才執行。

MVC的原理

在web.xml里有這樣一個配置,如下圖:

這是一個原生的servlet,通常 spring的控制器就是通過它來執行的,當客戶端請求控制器的時候,會經過這個servlet,這個servlet會對url進行解析,獲取到url中的所需的數據,根據這個數據去判斷應該執行那個對象中的哪個方法,以及需要不需要執行攔截器。 最後根據對象中的方法的返回值進行判斷,是該轉發還是重定向,還是返回json等。

具體分為以下幾步:

在這個servlet首次創建的時候

1、 根據MVC配置文件中的,下圖所示節點中的包名 去掃描包下的所有類,並創建controller的bean對象,並存入到servletcontext中。

2、 從servletcontext中獲取到controller對象集,進行迭代,在迭代的過程中通過反射獲取到他的成員變數,判斷成員變數是否有resource,autowrite之類的註解,如果有則從servletcontext中查詢到匹配的bean對象,進行賦值

2、 獲取到controller中的所有方法,并迭代,在迭代的過程中判斷 是否有RequestMapping註解,如果有,則將註解中的信息和方法名還有類全名 保存下來,最終保存到servletcontext中。

客戶端發起請求時

首先大家都知道,請求 需要根據springmvc的規則來,也就是url的結尾必須是 方法上的requestMapping註解的value值+DispatcherServlet要攔截的那個後綴

客戶端發起請求時,會通過DispatcherServlet,這個servlet會對url進行解析,獲取到url中的結尾,並去掉後綴,根據這個值 去servletcontext中查詢相應的信息,信息包括 類全名,方法名。根據類全名去servletcontext中查詢對應的controller對象,並執行這個對象下的相應的方法。執行完之後 會返回值給DispatcherServlet,DispatcherServlet根據返回值進行判斷和處理。

以上就是IOC,AOP,MVC的基本原理,因為時間關係,說的不是很清晰,可能閱讀起來比較亂,不好理解,而且攔截器這塊也沒提到, 但是 將就一下啦。哈哈。


推薦閱讀:

Spring AOP中定義切點(PointCut)和通知(Advice)
C++實現簡單的攔截器
小議webpack下的AOP式無侵入注入

TAG:Spring | AOP | IOC |