1. 程式人生 > >SSM框架執行流程及底層原始碼講解【本文持續更新...】

SSM框架執行流程及底層原始碼講解【本文持續更新...】

SSM框架執行流程及底層原始碼講解

---- 本篇文章主要講解市面流行的專案框架:SpringMVC+Spring+MyBatis (簡稱SSM) 的執行流程以及執行過程中各個關鍵技術的底層實現原理。(博主接觸java程式語言近兩年時間,一直對框架實現原理懵懵懂懂,終於下定決心研究一番底層原始碼,本文為原創作品,原文出自本人hexo+github個人部落格,地址: https:lhbit.top   懶得再重寫一遍,直接貼過來算了,如有講解不周之處還望見諒,如有異議或不同見解,請評論區留言,謝謝!)

SpringMVC框架

簡單介紹:

----SpringMVC 是一種基於 Java 的實現 MVC 設計模型的請求驅動型別的輕量級 Web 框架,屬於 SpringFrameWork 的後續產品,已經融合在 Spring Web Flow 裡面。Spring 框架提供了構建 Web 應用程式的全功能 MVC 模組。使用 Spring 可插入的 MVC 架構,從而在使用 Spring 進行 WEB 開發時,可以選擇使用 Spring的 Spring MVC 框架或整合其他 MVC 開發框架,如 Struts1(現在一般不用),Struts2 等。SpringMVC 已經成為目前最主流的 MVC 框架之一,並且隨著 Spring3.0 的釋出,全面超越 Struts2,成為最優秀的 MVC 框架。它通過一套註解,讓一個簡單的 Java 類成為處理請求的控制器,而無須實現任何介面。同時它還支援RESTful 程式設計風格的請求。

清晰的角色劃分

  • 前端控制器(DispatcherServlet)

  • 處理器對映器(HandlerMapping)

  • 處理器介面卡(HandlerAdapter)

  • 檢視解析器(ViewResolver)

  • 處理器或頁面控制器(Controller)

  • 驗證器( Validator)

  • 命令物件(Command 請求引數繫結到的物件就叫命令物件)

  • 表單物件(Form Object 提供給表單展示和提交到的物件就叫表單物件)

單個業務執行流程:

  1. tomcat啟動: 載入應用的web.xml

  2. 例項化並初始化Servlet

  3. 載入spring.xml配置檔案建立spring容器,根據配置初始化容器中的物件。

  4. 瀏覽器客戶端傳送請求,例如Hello()

  5. 請求到達前端控制器:DispatcherServlet

  6. 前端控制器擷取動作名稱Hello(),並從@RequestMapping中找具體的Hello方法

  7. 找到後,執行控制器中的方法

  8. 假如方法有返回值,則根據返回值通過InternalResourceViewResolver找到相應的結果檢視

  9. 響應給瀏覽器,展示結果

詳細執行流程:

  1. 前端頁面傳送Request請求給前端控制器:DispatcherServlet

  2. DispatcherServlet 請求查詢Handler 到處理器對映器HandlerMapping

  3. HandlerMapping 返回一個執行鏈:HandlerExecutionChain{ HandlerInterceptor1 HandlerInterceptor2 HandlerInterceptor3 ...... Handler } 給前端控制器DispatcherServlet

  4. 前端控制器請求介面卡HandlerAdapter執行

  5. 處理器Controller執行邏輯,呼叫業務層(Service層),業務層呼叫持久層(DAO)層,然後逐層返回到Controller

  6. Controller 返回 ModelAndView 給介面卡

  7. 介面卡返回ModelAndView 給 DispatcherServlet

  8. DispatcherServlet請求檢視解析器(ViewResolver)進行檢視解析,

  9. 檢視解析器返回View給DispatcherServlet

  10. 進行檢視渲染,將模型資料填充到request域

  11. DispatcherServlet給前臺頁面response響應

Spring框架(程式設計師的春天)

簡單介紹:

---- Spring是分層的 Java SE/EE應用 full-stack 輕量級開源框架,以 IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面程式設計)為核心,提供了展現層 SpringMVC 和持久層 Spring JDBC 以及業務層事務管理等眾多的企業級應用技術,還能整合開源世界眾多著名的第三方框架和類庫,逐漸成為使用最多的Java EE 企業應用開源框架。

---- 先上兩張Spring的類結構圖

spring框架執行流程

---- 使用spring配置,需要在web.xml中配置一個spring的監聽器和啟動引數(context-param),如下:

 <!-- 配置載入類路徑的配置檔案 -->
 <context-param>
    <param-name>contextConfigLocation</param-name>    
    <param-value>classpath*:applicationContext.xml</param-value>
 </context-param>
 
 <!-- 配置監聽器 -->
 <listener>    
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

---- web容器啟動時,下面為spring載入執行步驟:

  1. 執行web.xml中的ContextLoaderListener監聽器

  2. 初始化ContextLoaderListener中的contextInitialized方法

  3. contextInitialized方法中呼叫父類(ContextLoader)的initWebApplicationContext方法

  4. initWebApplicationContext方法中執行了三個任務

    • 建立WebApplicationContext容器

    • 載入context-param中配置的spring配置檔案

    • 初始化配置檔案及建立配置檔案中的bean

---- 最後,當web容器停止時候會執行ContextLoaderListener的contextDestroyed方法銷燬context容器

MyBatis框架

簡單介紹:

---- MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或註解,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。

MyBatis主要的類

  • Configuration MyBatis所有的配置資訊都維持在Configuration物件之中。

  • SqlSession 作為MyBatis工作的主要頂層API,表示和資料庫互動的會話, 完成必要資料庫增刪改查功能

  • Executor MyBatis執行器,是MyBatis 排程的核心,負責SQL語句的生成和查詢快取的維護

  • StatementHandler 封裝了JDBC Statement操作,負責對JDBC statement 的操作,如設定引數、將Statement結果集轉換成List集合。

  • ParameterHandler 負責對使用者傳遞的引數轉換成JDBC Statement 所需要的引數,

  • ResultSetHandler 負責將JDBC返回的ResultSet結果集物件轉換成List型別的集合;

  • TypeHandler 負責java資料型別和jdbc資料型別之間的對映和轉換

  • MappedStatement MappedStatement維護了一條<select|update|delete|insert>節點的封裝,

  • SqlSource 負責根據使用者傳遞的parameterObject,動態地生成SQL語句,將資訊封裝到BoundSql物件中,並返回

  • BoundSql 表示動態生成的SQL語句以及相應的引數資訊

  以上幾個類在SQL操作中都會涉及,在SQL操作中重點關注下SQL引數什麼時候寫入和結果集怎麼轉換為Java物件,這兩個過程正好對應的類是PreparedStatementHandler和ResultSetHandler類。

Mybatis層次結構圖

Mybatis執行流程

---- 首先,SqlSessionFactory 會話工廠會載入 SqlMapConfig.xml 配置檔案資訊,然後生成一個可以與資料庫互動的會話例項類 SqlSession,會話例項類 SqlSession 會根據 Mapper 配置檔案中的 sql 配置,去執行相應的增刪改查操作。這樣,MyBatis 就實現了與資料庫的互動功能。具體流程圖如下:

---- 下面簡單介紹總結各個元件的含義和功能:

  Configuration.xml:該配置檔案是MyBatis的全域性配置檔案,在這個檔案中可以配置諸多專案,但是一般專案中,並不會配置太多內容,常用的內容是別名設定,攔截器設定等,至於環境設定與Mapper對映檔案的註冊會轉移到Spring配置檔案中(SSM整合之後),而其餘大部分的配置項都採用預設的配置。

  XMLConfigBuilder:該類是XML配置構建者類,是用來通過XML配置檔案來構建Configuration物件例項,構建的過程就是解析Configuration.xml配置檔案的過程,期間會將從配置檔案中獲取到的指定標籤的值逐個新增到之前建立好的預設Configuration物件例項中。

  Configuration:該類是MyBatis的配置類,建立這個類的目的就是為了使用其物件作為專案全域性配置物件,這樣通過配置檔案配置的資訊可以儲存在這個配置物件中,而這個配置物件在建立好之後是儲存在JVM的Heap記憶體中的,方便隨時讀取。不然每次需要配置資訊的時候都要臨時從磁碟配置檔案中獲取,程式碼複用性差的同時,也不利於開發。

  SqlSessionFactoryBuilder:該類是SqlSessionFactory(會話工廠)的構建者類,之前描述的操作其實全是從這裡面開啟的,首先就是呼叫XMLConfigBuilder類的構造器來建立一個XML配置構建器物件,利用這個構建器物件來呼叫其解析方法parse()來完成Configuration物件的建立,之後以這個配置物件為引數呼叫會話工廠構建者類中的build(Configuration config)方法來完成會話工廠物件的構建。

  SqlsessionFactory:該介面是會話工廠,是用來生產會話的工廠介面,DefaultSqlSessionFactory是其實現類,是真正生產會話的工廠類,這個類的例項的生命週期是全域性的,它只會在首次呼叫時生成一個例項(單例模式),就一直存在直到伺服器關閉。

  openSession():在最後的build(Configuration config)方法中會返回一個DefaultSqlSessionFactory類的例項,這個類是MyBatis提供的預設會話工廠類,而我們使用的也正是這個類中的來openSession()方法來完成SqlSession物件的建立。

  SqlSession:該介面是會話,是專案與資料庫之間的會話,類似於客戶端與伺服器之間的會話(session),這個SqlSession的生命週期是方法級的,因為他是非執行緒安全的,針對每一次資料庫訪問都要建立一個SqlSession,獲取到返回結果之後,這個SqlSession就會被廢棄。這區別於SqlSessionFactory的生命週期。

  Executor:執行器介面,SqlSession會話是面向程式設計師的,而內部真正執行資料庫操作的卻是Executor執行器,可以將Executor看作是面向MyBatis執行環境的,SqlSession就是門面貨,Executor才是實幹家。通過SqlSession產生的資料庫操作,全部是通過呼叫Executor執行器來完成的。

  StatementHandler:該類是Statement處理器,封裝了Statement的各種資料庫操作方法execute(),可見MyBatis其實就是將操作資料庫的JDBC操作封裝起來的一個框架,同時還實現了ORM罷了。

  ResultSetHandler:結果集處理器,如果是查詢操作,必定會有返回結果,針對返回結果的操作,就要使用ResultSetHandler來進行處理,這個是由StatementHandler來進行呼叫的。這個處理器的作用就是對返回結果進行處理。

                                   - - - - - - - - - -暫時先寫到這裡,本文持續更新,未完待續.... - - - - - - - - - - 

SSM 整合