1. 程式人生 > >基於Maven的SSM總體架構設計(一)

基於Maven的SSM總體架構設計(一)

基於Maven的SSM總體架構設計(一)

1 概述

1.1 編寫目的

        本文描述了基於SSM的總體架構設計和實現思路,包括約定開發框架、設計規範、開發規範。用於指導專案組在同一規範下進行程式設計和開發,從而降低專案組內溝通的成本,文件內容包括了專案中使用的主要技術方案及主要功能的實現思路,本文件作為專案設計與實現階段的指導性文件,是專案設計與開發的重要參考。還可以作為專案組新進人員的學習資料,讓新員工儘快融入到統一的規範下工作。

1.2 讀者物件

本文件適用於系統架構師、軟體設計工程師、軟體開發工程師、測試工程師。

1.3 引用檔案

  • [《Spring Framework開發參考手冊》 檔案編號:無] 
  • [《Java EE開發的顛覆者Spring Boot實戰》 檔案編號:無] 
  • [《精通Spring MVC4》 檔案編號:無] 
  • [《MyBatis_3文件》 檔案編號:無]

1.4 術語表

縮寫 解釋
OOA Object Oriented Analysis,面向物件分析
OOD Object Oriented Design,面向對形象設計
OOP Object Oriented Programming,面向物件程式設計
PDL 虛擬碼
IOC 控制反轉
DI 依賴注入
AOP 面向切面程式設計
IDE Integrated Development Environment,整合開發環境
DBMS 資料庫管理系統

2 相關技術介紹

2.1 Spring框架介紹

官方網站:https://spring.io

2.1.1 Spring簡介

        Spring是一個開源框架,是為了解決企業應用程式開發複雜性而建立的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個元件,同時為JAVAEE應用程式開發提供整合框架。
        Spring是應兩個目標而出現的,第一是促進最佳編碼實踐。第二是讓現有的框架更加易用。所以,Spring可以有效降低程式的耦合度,提高開發人員的生產效率,讓開發人員能夠編寫更好、更小以及更乾淨的程式碼,使開發者可以只關注業務邏輯的開發。

2.1.2 Spring框架模組結構

圖2-1 Spring框架模組結構圖
        Spring框架是一個分層架構,由7個定義良好的模組組成。Spring模組構建在核心容器之上,核心容器定義了建立、配置和管理bean的方式,如圖2-1所示。
        組成Spring框架的每個模組(或元件)都可以單獨存在,或者與其他一個或多個模組聯合實現。每個模組的功能如下:
核心容器(Spring Core): 核心容器提供Spring框架的基本功能。核心容器的主要元件是BeanFactory,它是工廠模式的實現。BeanFactory使用控制反轉(IOC)模式將應用程式的配置和依賴性規範與實際的應用程式程式碼分開。
Spring上下文(Spring Context): Spring上下文是一個配置檔案,向Spring框架提供上下文資訊。Spring上下文包括企業服務,例如JNDI、EJB、電子郵件、國際化、校驗和排程功能。
**Spring AOP:**通過配置管理特性,Spring AOP模組直接將面向方面的程式設計功能整合到了Spring框架中。所以,可以很容易地使Spring框架管理的任何物件支援AOP。Spring AOP模組為基於Spring的應用程式中的物件提供了事務管理服務。通過使用Spring AOP,不用依賴EJB元件,就可以將宣告性事務管理整合到應用程式中。
Spring DAO: JDBC DAO抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同資料庫供應商丟擲的錯誤訊息。異常層次結構簡化了錯誤處理,並且極大的降低了需要編寫的異常程式碼數量(例如開啟和關閉連線)。Spring DAO的面向JDBC的異常遵從通用的DAO異常層次結構。
Spring ORM: Spring框架插入了若干個ORM框架,從而提供了ORM的物件關係工具,其中包括JDO、Hibernate和MyBatis。所有這些都遵從Spring的通用事務和DAO異常層次結構。
Spring Web模組:Web上下文模組建立在應用程式上下文模組之上,為基於Web的應用程式提供了上下文。所以,Spring框架支援與Struts的繼承。Web模組還簡化了處理多部分請求以及將請求引數繫結到域物件的工作。
Spring MVC框架: MVC框架是一個全功能的構建Web應用程式的MVC實現。通過策略介面,MVC框架變為高度可配置的,MVC容納了大量檢視技術,其中包括JSP、Velocity、Tiles、iText和POI。
        Spring框架的功能可以用在任何JAVAEE伺服器中,大多數功能也適用於不受管理的環境。Spring的核心要點是:支援不繫結到特定JAVAEE服務的可重用業務和資料訪問物件。毫無疑問,這樣的物件可以在不同JAVAEE環境(Web或EJB)、獨立應用程式、測試環境之間重用。

2.1.3 Spring相關概念

IOC(Inversion of Control控制反轉)
控制反轉模式(也稱作依賴性介入)的基本概念是:不建立物件,但是描述建立它們的方式。在程式碼中不直接與物件和服務連線,但在配置檔案中描述哪一個元件需要哪一項服務。容器(在Spring框架中是IOC容器)負責將這些聯絡在一起。
DI(Dependency Injection依賴注入)
依賴注入是指強制把元件的定義和元件的使用分開。
AOP(Aspect-Oriented Programming面向方面程式設計)
將程式中的交叉業務邏輯(比如安全,日誌,事務等),封裝成一個切面,然後注入到目標物件(具體業務邏輯)中區。AOP的目的是將複雜邏輯進行分離,抽取共性,讓各部分實現的功能更為專一。
Aspect(方面): 我們所關注的,可以被抽取的業務邏輯,如事務管理、日誌、異常處理,泛指業務邏輯。
JoinPoint(連線點): 切面可以被織入到目標物件的位置,泛指屬性連結點,方法連線點。程式在執行過程中明確的點,通常是某個業務方法。
Advice(通知): 在特定的連線點執行的動作,通知是指方面功能的實現程式碼,如日誌程式碼。通知型別有前置通知、後置通知、環繞通知和異常處理通知。
PointCut(切入點): 一組規定,規定一個切面可以織入到哪個類的哪些方法。即一組JointPoint。
Advisor(通知者): 是一種特殊的通知,規定了哪個切面,要織入到哪個類的哪些方法。
TargetObject(目標物件): 包含連線點的物件,也稱為被代理的物件,通常是具體的業務邏輯物件。
Proxy: aop代理物件。
Weaving: 織入。將Aspect加入到程式程式碼的過程,對於Spring AOP,由ProxyFactory或者ProxyFactoryBean負責織入動作。

2.2 MyBatis框架介紹

最新網址:https://github.com/mybatis
相關網址:http://www.mybatis.org

2.2.1 MyBatis的來源

        MyBatis本是apache的一個開源專案iBatis,2010年這個專案由apache software foundation遷移到了google code,並且改名為MyBatis。2013年11月遷移到Github。
        iBatis一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。iBatis提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。與Hibernate等重量級ORM框架相比,MyBatis由開發人員手動寫SQL,相對靈活性更大,更容易保證DB訪問的效能,非常適合熟悉SQL編寫的團隊。

2.2.2 MyBatis應用簡介

        MyBatis是支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJOs(Plain Old Java Objects,普通的Java物件)對映成資料庫中的記錄。
        每個MyBatis應用程式主要都是使用SqlSessionFactory例項,一個SqlSessionFactory例項可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置檔案或者一個預定義的配置類的例項獲得。
        用xml檔案構建SqlSessionFactory例項是非常簡單的事情。推薦在這個配置中使用類路徑資源(classpath resource),但你可以使用任何Reader例項,包括用檔案路徑或file://開頭的url建立的例項。MyBatis有一個實用類----Resources,它有很多方法,可以方便地從類路徑及其他位置載入資源。

2.2.3 MyBatis的使用流程

圖2-2 MyBatis使用流程示意圖

  1. 載入配置並初始化
    觸發條件:載入配置檔案。
    將SQL的配置資訊載入成為一個個MappedStatement對性愛那個(包括了傳入引數對映配置、執行的SQL語句、結果對映配置),儲存在記憶體中。
  2. 接收呼叫請求
    觸發條件:呼叫MyBatis提供的API。
    傳入引數:為SQL的ID和傳入引數物件。
    處理過程:將請求傳遞給下層的請求處理層進行處理。
  3. 處理操作請求
    觸發條件:API介面層傳遞請求過來
    傳入引數:為SQL的ID和傳入引數物件
    處理過程:
    1) 根據SQL的ID查詢對應的MappedStatement物件。
    2) 根據傳入引數物件解析MappedStatement物件,得到最終要執行的SQL和執行傳入引數。
    3) 獲取資料庫連線,根據得到的最終SQL語句和執行傳入引數到資料庫執行,並得到執行結果。
    4)根據MappedStatement物件中的結果對映配置對得到的執行結果進行轉換處理,並得到最終的處理結果。
    5) 釋放連線資源。
  4. 返回處理結果將最終的處理結果返回。

2.2.4 MyBatis功能架構

圖2-3 MyBatis功能架構圖
MyBatis的功能架構分為三層:
1. API介面層: 提供給外部使用的介面API,開發人員通過這些本地API來操縱資料庫。介面層一接收到呼叫請求就會用資料處理層來完成具體的資料處理。
2. 資料處理層: 負責具體的SQL查詢、SQL解析、SQL執行和執行結果對映處理等。它主要的目的是根據呼叫的請求完成一次資料庫操作。
3. 基礎支撐層: 負責最基礎的功能支撐,包括連線管理、事務管理、配置載入和快取處理,這些都是共用的東西,將他們抽取出來作為最基礎的元件。為上層的資料處理層提供最基礎的支撐。

2.2.5 MyBatis框架架構

圖2-4 MyBatis框架架構圖
1. 載入配置: 配置來源於兩個地方,一處是配置檔案,一處是Java程式碼的註解,將SQL的配置資訊載入成為一個個MappedStatement物件(包括了傳入引數對映配置、執行的SQL語句、結果對映配置),儲存在記憶體中。
2. SQL解析: 當API介面層接收到呼叫請求時,會接收到傳入SQL的ID和傳入物件(可以是Map、JavaBean或者基本資料型別),MyBatis會根據SQL的ID找到對應的MappedStatement,然後根據傳入引數物件對MappedStatement進行解析,解析後可以得到最終要執行的SQL語句和引數。
3. SQL執行: 將最終得到的SQL和引數拿到資料庫進行執行,得到操作資料庫的結果。
4. 結果對映: 將操作資料庫的結果按照對映的配置進行轉換,可以轉換成HashMap、JavaBean或者基本資料型別,並將最終結果返回。

2.3 Apache Shiro框架介紹

官方網站:http://shiro.apache.org

2.3.1 Shiro簡介

        Apache Shiro是Java的一個安全框架。目前,使用Apache Shiro的人越來越多,因為它相當簡單,對比Spring Security,可能沒有Spring Security做的功能強大,但是在實際工作時可能並不需要那麼複雜,所以使用小而簡單的Shiro就足夠了。
        Shiro可以非常容易的開發出足夠好的應用,其不僅可以用在JavaSE環境,也可以用在JavaEE環境。Shiro可以幫助我們完成:認證、授權、加密、會話管理、與Web整合、快取等。而且Shiro的API也是非常簡單。
圖2-5 Shiro功能結構圖
Authentication: 身份認證/登入,驗證使用者是不是擁有相應的身份;
Authorization:授權,即許可權驗證,驗證某個已認證的使用者是否擁有某個許可權;即判斷使用者是否有執行某個操作的許可權。常見的如:驗證某個使用者是否擁有某個角色。或者細粒度的驗證某個使用者對某個資源是否具有某個許可權;
SessionManager: 會話管理,即使用者登入後就是一次會話,在沒有退出之前,它的所有資訊都會在會話中;會話可以是普通JavaSE環境的,也可以是Web環境的;
Cryptography: 加密,保護資料的安全性,如密碼加密儲存到資料庫,而不是明文儲存;
Web Support: Web支援,可以非常容易的整合到Web環境;
Caching: 快取,比如使用者登入後,其使用者資訊、擁有的角色/許可權不必每次去查,這樣可以提高效率;
Concurrency: Shiro支援多執行緒應用的併發驗證,即如在一個執行緒中開啟另一個執行緒,能把許可權自動傳播過去;
Testing: 提供測試支援;
Run As: 允許一個使用者假裝為另一個使用者(如果他們允許)的身份進行訪問;
Remember Me: 記住我,這個非常常見的功能,即一次登入後,下次再來的話就不用登入了。

2.3.2 Shiro的應用流程

        對於一個好的框架,從外部來看應該具有非常簡單易於使用的API,且API契約明確;從內部來看的話,其應該有一個可擴充套件的架構,即非常容易插入使用者自定義實現,因為任何框架都不能滿足所有需求。
        首先,我們從外部來看Shiro,即從應用程式角度來觀察如何使用Shiro完成工作。如下圖:
圖2-6 Shiro應用流程示意圖
        可以看到:應用程式碼直接互動的物件是Subject,也就是說Shiro的對外API核心就是Subject;其每個API的含義如下:
Subject: 主體,代表了當前“使用者”,這個使用者不一定是一個具體的人,與當前應用互動的任何東西都是Subject,如網路爬蟲,機器人等;即一個抽象概念,所有Subject都繫結到SecurityManager,與Subject的所有互動都會委託給SecurityManager。可以把Subject認為是一個門面,SecurityManager才是實際的執行者;
SecurityManager: 安全管理器;即所有與安全有關的操作都會與SecurityManager互動;且它管理著所有Subject。可以看出它是Shiro的核心,它負責與後邊介紹的其他元件進行互動,如果學習過SpringMVC,可以把它看成DispatcherServlet前端控制器;
Realm: 域,Shiro從Realm獲取安全資料(如使用者、角色、許可權),就是說SecurityManager要驗證使用者身份,那麼它需要從Realm獲取相應的使用者進行比較以確定使用者身份是否合法。也需要從Realm得到使用者相應的角色/許可權進行驗證使用者是否進行操作,可以把Realm看成DataSource,即安全資料來源。
也就是說對於我們而言,最簡單的一個Shiro應用:
1、 應用程式碼通過Subject來進行認證和授權,而Subject又委託給SecurityManager;
2、 我們需要給Shiro的SecurityManager注入Realm,從而讓SecurityManager能得到合法的使用者及許可權進行判斷。
        Shiro不會去維護使用者、維護許可權,這些需要我們自己去設計/提供,然後通過相應的介面注入給Shiro即可。

2.3.3 Shiro架構

接下來我們從Shiro內部來看下Shiro的架構,如下圖所示:
圖2-7 Shiro架構圖
Subject: 主體,可以看到主體可以是任何可以與應用互動的“使用者”;
SecurityManager: 相當於SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher,是Shiro的心臟。所有具體的互動都通過SecurityManager進行控制,它管理著所有Subject、且負責進行認證和授權、及會話、快取的管理;
Authenticator: 認證器,負責主體認證,這是一個擴充套件點,如果使用者覺得Shiro預設的不好,可以自定義實現。其需要認證策略(Authentication Strategy),即什麼情況下算使用者認證通過了;
Authrizer: 授權器,或者訪問控制器,用來決定主體是否有許可權進行相應的操作,即控制著使用者能訪問應用中的那些功能;
Realm: 可以有1個或多了個Realm,可以認為是安全實體資料來源,即用於獲取安全實體的,可以是JDBC實現,也可以是LDAP實現,或者記憶體實現等等,由使用者提供。注意:Shiro不知道你的使用者/許可權儲存在哪及以何種格式儲存,所以我們一般在應用中都需要實現自己的Realm;
SessionManager: 如果寫過Servlet就應該指導Session的概念,Session需要有人管理它的生命週期,這個元件就是SessionManager。而Shiro並不僅僅可以用在Web環境,也可以用在如普通的JavaSE環境、EJB等環境。所以,Shiro就抽象了一個自己的Session來管理主體與應用之間互動的資料。比如我們在Web環境中,剛開始是一臺Web伺服器,接著又上了臺EJB伺服器,這時想把兩臺伺服器的會話資料放到一個地方,就可以實現自己的分散式會話(如把資料放到Memcached伺服器);
SessionDAO: DAO(資料訪問物件)大家都用過,SessionDAO用於會話的CRUD,比如我們想把Session儲存到資料庫,那麼可以實現自己的SessionDAO,通過JDBC寫到資料庫。或者把Session放到Memcached中,可以實現自己的Memcached SessionDAO。另外,SessionDAO中可以使用Cache進行快取,以提高效能;
CacheManager: 快取控制器,管理使用者、角色、許可權等的快取,因為這些資料基本上很少改變,放到快取中可以提高訪問效能;
Cryptography: 密碼模組,Shiro提高了一些常見的加密元件用於如密碼加密/解密。

2.4 Apache Maven簡介

官方萬展:http://maven.apache.org

        Apache Maven是一個軟體專案管理和綜合工具。基於專案物件模型(POM)的概念,Maven可以從一箇中心資料片管理專案構建,報告和檔案。

2.4.1 Maven是什麼

        Maven是一個專案管理和綜合工具。Maven提供了開發人員構建一個完整的生命週期框架。開發團隊可以自動完成專案的基礎工具建設,Maven使用標準的目錄結構和預設構建生命週期。
        在多個開發團隊環境時,Maven可以設定按標準在非常短的時間裡完成配置工作。由於大部分專案的設定都很簡單,並且可重複使用,Maven讓開發人員的工作更輕鬆,同時建立報表,檢查,構建和測試自動化設定。
Maven提供了開發人員的方式來管理:

  • Builds 
  • Documentation 
  • Reporting 
  • Dependencies 
  • SCMs 
  • Releases
  • Distribution 
  • Mailing list
            概括地說,Maven簡化和標準化專案建設過程。處理編譯,分配,文件,團隊協作和其他任務的無縫連線。Maven增加可重用性並負責建立相關的任務。

2.4.2 Maven目標

Maven最初設計,是以簡化Jakarta Turbine專案的建設。在幾個專案中,每個專案包含了不同的Ant構建檔案。JAR檢查到CVS。
Apache組織開發Maven可以建立多個專案,釋出專案資訊,專案部署,在幾個專案中對JAR檔案進行管理,並提供團隊合作和幫助。
Maven主要目標是提供給開發人員:

  • 可重複使用,易維護,更容易理解的一個綜合模型。 
  • 外掛或互動的工具,宣告性的模式。
    Maven專案的結構和內容在一個XML檔案中生命,pom.xml專案物件模型(POM),這是整個Maven系統的基本單元。

2.4.3 Maven資源庫

有些術語需要在Maven使用前理解。
Maven本地資源庫
Maven的本地資源庫是用來儲存專案的依賴庫,預設的資料夾是“.m2”目錄,可能需要將其更改為另一個資料夾。
Maven中央儲存庫
Maven中央儲存庫是Maven用來下載所有專案的依賴庫的預設位置。
如何從Maven遠端儲存庫下載?如何新增遠端庫?
並非所有的庫都儲存在Maven的中央儲存庫,很多時候需要從其他位置新增一些遠端倉庫,而不是預設的中央儲存庫下載。
Maven依賴機制
這裡的文章是關於傳統方式和Maven方式的依賴庫的不同,並說明Maven會從哪裡搜尋這些庫。
定製庫到Maven本地資源庫
很多庫仍然不支援Maven的pom.xml的概念,可以參考Maven指南掌握如何包括“非Maven支援”庫到Maven本地資源庫中。

(未完待續…)