Spring 是一個輕量級的 IOC 和 AOP 容器框架。是爲 Java 應用程序提供基礎性服務的一套框架,目的是用於簡化企業應用程序的開發,它使得開發者只須要關心業務需求。常見的配置方式有三種:基於 XML 的配置、基於註解的配置、基於 Java 的配置。html
主要由如下幾個模塊組成:前端
AOP 能夠說是對OOP的補充和完善。OOP 引入封裝、繼承和多態性等概念來創建一種對象層次結構,用以模擬公共行爲的一個集合。當咱們須要爲分散的對象引入公共行爲的時候,OOP 則顯得無能爲力。也就是說,OOP 容許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌代碼每每水平地散佈在全部對象層次中,而與它所散佈到的對象的核心功能毫無關係。在 OOP 設計中,它致使了大量代碼的重複,而不利於各個模塊的重用。
AOP 是面向切面編程, 將程序中的交叉業務邏輯(好比安全,日誌,事務等),封裝成一個切面,而後注入到目標對象(具體業務邏輯)中去。java
織入:指代碼切入到目標函數的過程,例如 aspectJ 到 java 程序的過程稱爲織入。數據庫
在編譯期,切面直接以字節碼的形式編譯到目標字節碼文件中。
AspectJ 屬於靜態 AOP,是在編譯時進行加強,會在編譯的時候將 AOP 邏輯織入到代碼中,須要專有的編譯器和織入器。編程
實現原理是爲被代理的業務接口生成代理類,將AOP邏輯寫入到代理類中,在運行時動態織入AOP,使用反射執行織入的邏輯。
主要實現方式依賴 java.lang.reflect 包下的 InvocationHandler 和 Proxy 類。安全
CGLib 是動態代碼字節生成的實現,它封裝字節碼生成工具 Asm,原理是在運行期間目標字節碼加載後,生成目標類的子類,將切面邏輯加入到子類中,因此使用 Cglib 實現 AOP 不須要基於接口。微信
在運行前,目標加載前,將切面邏輯加到目標字節碼中。app
在傳統的開發模式下,咱們都是採用直接 new 一個對象的方式來建立對象,也就是說你依賴的對象直接由你本身控制,可是有了 IOC 容器後,則直接由 IoC 容器來控制。因此「誰控制誰」,固然是 IoC 容器控制對象。框架
MVC指MVC模式的某種框架,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分紅三個核心部件:模型、視圖、控制器。它們各自處理本身的任務.函數
Model(模型)用於處理應用程序數據邏輯的部分。一般模型對象負責在數據庫中存取數據。
View(視圖)處理數據顯示的部分。一般視圖是依據模型數據建立的。
Controller(控制器)處理用戶交互的部分。一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。它使視圖與模型分離開。
Spring MVC 框架主要由 DispatcherServlet、處理器映射、控制器、視圖解析器、視圖組成.
Spring MVC 的工做流程以下:
在圖 1 中包含 4 個 Spring MVC 接口,即 DispatcherServlet(前端控制器)、HandlerMapping、Controller 和 ViewResolver(視圖解析器)。
DispatcherServlet: Spring MVC 全部的請求都通過 DispatcherServlet 來統一分發,在 DispatcherServlet 將請求分發給 Controller 以前須要藉助 Spring MVC 提供的 HandlerMapping 定位到具體的 Controller。
HandlerMapping: 接口負責完成客戶請求到 Controller 映射。
Controller :處理用戶請求。一旦 Controller 處理完用戶請求,將返回 ModelAndView 對象給 DispatcherServlet 前端控制器,ModelAndView 中包含了模型(Model)和視圖(View)。表示模型應該映射到哪一個視圖上,但傳遞的視圖名並不直接表示某個特定的JSP,僅僅傳遞了一個邏輯名稱,這個名字將用來查找產生結果的真正視圖。DisPatcherServlet將會使用視圖解析器來將邏輯視圖名匹配微一個特定的視圖實現。
從宏觀角度考慮,DispatcherServlet 是整個 Web 應用的控制器;從微觀考慮,Controller 是單個 Http 請求處理過程當中的控制器,而 ModelAndView 是 Http 請求過程當中返回的模型(Model)和視圖(View)。
ViewResolver(視圖解析器):在 Web 應用中負責查找 View 對象,從而將相應結果渲染給客戶。