爲什麼要使用SSM框架進行項目開發

前言:簡單的來說,我們可以將Spring Boot看做一個啓動、配置、快速開發的輔助框架,其本身針對的則是微服務。Spring Boot只是爲了提高我們的開發效率,是爲了提升生產力,但是在一個web項目的開發當中,MVC的開發模式還是必不可少的。


目錄

一、Spring

二、Spring MVC

三、Mybatis

四、總結


SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis兩個開源框架整合而成(SpringMVC是Spring中的部分內容)。常作爲數據源較簡單的web項目的框架。

一、Spring

Spring 是一個分層的 JavaSE/EE Full-Stack(一站式) 輕量級開源框架。經典的 MVC 三層結構爲表現層、業務層、持久層,Web表現層負責頁面數據顯示、頁面跳轉調度,例如 JSP/Servlet、SpringMVC;Service業務層負責業務處理、功能邏輯和事務控制,例如 Service、JavaBean、EJB;而持久層Dao則負責數據存取和封裝,及與數據庫打交道,例如 JDBC、Hibernate、Mybatis

Spring的一站式則是指JavaEE的每層都提供瞭解決方案,

  • 表現層:Struts1、Struts2、Spring MVC;
  • 業務層:IoC 控制反轉、AOP 面向切面編程、事務控制;
  • 持久層:JdbcTemplate、HibernateTemplate、ORM 框架(對象關係映射)的整合。

Spring的輕量級則是從大小和開銷兩部分來說的。一個完整的Spring框架可以在很小的Jar包裏進行發佈,其所需要的處理開銷也是很小的,spring的出現解決了EJB 的繁瑣複雜、脫離現實的缺點。

Spring框架是一個爲Java應用程序的開發提供了綜合、廣泛的基礎性支持的Java平臺。框架本身是按照設計模式構建,這使得我們可以在開發環境中安心的集成Spring框架,不必擔心Spring是如何在後臺進行工作的。

1、Spring的結構體系

Spring框架至今已集成了20多個模塊。這些模塊主要包括核心容器、數據訪問/集成,、Web、AOP(面向切面編程)、工具、消息和測試模塊。

核心容器(Core Container)包括 Core、Beans、Context、EL 模塊。

  • Core 和 Beans 模塊提供了 Spring 最基礎的功能,Core 模塊是核心,爲其他模塊提供支持,包括 Spring 的核心工具類。Beans 是 Spring 管理實體類 Bean 的主要模塊,提供 IoC 控制反轉和依賴注入 DI。控制反轉即將控制權由原來的程序員自己管理交給 Spring 來管理,依賴注入就是注入對象實例,有四種方式,即接口注入、setter 方法注入、構造器注入和註解注入。

  • Context 上下文模塊,主要基於 Core 和 Beans 模塊,Context 模塊的 Context 包繼承了 Beans 包的功能,還增加了國際化(I18N)、事件傳播等,Context 上下文模塊,還包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。

  • Expression Language,表達式語言模塊,又稱 SpEL,提供了在運行期間查詢和操作對象圖的強大能力。包含五個主要特性:(1)使用 Bean 的 ID 引用 Bean;(2)調用方法和訪問對象的屬性;(3)對值進行算術,關係和邏輯運算;(4)正則表達式匹配;(5)集合操作。

2、Spring 的三大核心

Spring 的三大核心分別爲 IOC(Inverse of Control 控制反轉)、DI(Dependency Injection,依賴注入)和AOP(Aspect Oriented Programming 面向切面編程)。

    1、IOC(Innverse Of Controller控制反轉)

//IOC,即將創建對象的權利交給Spring工廠管理
Content content  = new Content();
//現在可以這樣去寫
Content content = ContentFactory.getContent();

 2、DI(Dependency Injection,依賴注入)

DI 是指在 Spring 框架創建 Bean 對象時,動態地將依賴對象注入到 Bean 組件。簡單的說,就是將一個 Bean 對象動態地注入到另一個 Bean 中。DI 的做法是:由 Spring 容器創建 Service、Dao 對象,並且通過註解或配置將 Dao 傳入 Servcie,那麼 Service 對象就包含了 Dao 對象的引用。比如:

@Service
public class UserServiceImpl implements UserService {
    @Autowired //通過註解注入UserMapper對象
    private UserMapper userMapper;

}

3、AOP(Aspect Oriented Programming 面向切面編程)

AOP 採取橫向抽取機制,取代了傳統縱向繼承體系重複性代碼的編寫方式(例如性能監視、事務管理、安全檢查、緩存、日誌記錄等)。AOP 基於代理思想,對原來目標對象,創建代理對象,在不修改原對象代碼情況下,通過代理對象,調用增強功能的代碼,從而對原有業務方法進行增強。例如可以在插入 User 對象之前進行打印日誌,請看下面的代碼示例。

//UserService.java
public interface UserService {

    void add(User user);
}
//前置增強類 PrintLogBefore.java
//前置增強代碼
public class PrintLogBefore implements MethodBeforeAdvice {

    private static final Logger log = Logger.getLogger(PrintLogBefore.class);

    @Override
    public void before(Method method, Object[] arguments, Object target)
            throws Throwable {

        log.info("在插入User之前執行的方法");

    }

}
//最後配置切入點
<bean id="printBefore" class="dreamland.aop.test.PrintLogBefore"></bean>
<aop:config>
   <aop:pointcut expression="execution(public void save(dreamland.aop.entity.User))" id="pointcut"/>         
   <aop:advisor advice-ref="printBefore" pointcut-ref="pointcut"/>
</aop:config>

二、Spring MVC

Spring MVC屬於SpringFrameWork的後續產品,Spring 框架提供了構建 Web 應用程序的全功能 MVC 模塊。使用 Spring 可插入的MVC 架構,從而在使用Spring進行WEB開發時,可以選擇使用Spring的Spring MVC框架或集成其他MVC開發框架(struts2)。Spring框架是高度可配置的,而且包含多種視圖技術,例如jsp等。Spring MVC分離了控制器、模型對象、過濾器以及處理程序對象的角色,這樣的分離使得我們更加容易的去定製。

SpringMVC 通過一套 MVC 註解,讓 POJO 成爲處理請求的控制器,無需任何接口,同時,SpringMVC 還支持 REST 風格的 URL 請求。此外,SpringMVC 在數據綁定、視圖解析、本地化處理及靜態資源處理上都有許多不俗的表現。它在框架設計、擴展性、靈活性等方面全面超越了 Struts、WebWork 等 MVC 框架,從原來的追趕者一躍成爲 MVC 的領跑者。

SpringMVC 框架圍繞 DispatcherServlet 這個核心展開,DispatcherServlet 是前端控制器設計模式的實現,提供 Spring Web MVC 的集中訪問點,負責職責的分派,而且與 Spring IoC 容器無縫集成,從而可以獲得 Spring 的所有好處。

1、Spring MVC核心組件

  • DispatcherServlet:前端控制器,負責調度其他組件的執行,可降低不同組件之間的耦合性,Spring MVC 的核心模塊。
  • Handler:處理器,完成具體的業務邏輯。
  • HandlerMapping:DispatcherServlet 是通過 HandlerMapping 將請求映射到不同的 Handler。
  • HandlerInterceptor:處理器攔截器,是一個接口,如果需要完成一些攔截處理,可以實現該接口。
  • HandlerExecutionChain:處理器執行鏈,包括兩部分內容,Handler 和 HandlerInterceptor。
  • HandlerAdapter:處理器適配器,它可以完成執行業務邏輯之前的一些預處理,數據類型轉換、封裝等。 DispatcherServlet通過 HandlerAdapter 調⽤不同的 Handler。
  •  ModelAndView:裝載了模型數據和視圖信息,作爲 Hanlder 的處理結果,返回給DispatcherServlet。
  •  ViewResolver:視圖解析器,DispatcherServlet 通過它將邏輯視圖轉換成物理視圖,最終將渲染結果響應給客戶端

2、Spring MVC 框架流程

  1. 客戶端請求被 DispatcherServlet 接收。
  2. 根據 HandlerMapping 映射到 Handler。
  3. 創建 Handler 和 HandlerInterceptor。
  4. Handler 和 HandlerInterceptor 以 HandlerExecutionChain 的形式一併返回給DispatcherServlet。
  5. DispatcherServlet 通過 HandlerAdapter 調用 Handler 的方法完成業務邏輯處理。
  6. 返回一個 ModelAndView 對象給 DispatcherServlet。
  7. DispatcherServlet 將獲取的 ModelAndView 對象傳給 ViewResolver ,將邏輯視圖解析爲物理理視圖View。
  8. ViewResolver 返回⼀一個 View 給 DispatcherServlet。
  9.  DispatcherServlet 根據 View 進⾏行視圖渲染(將模型數據填充到視圖中)。
  10. DispatcherServlet 將渲染後的視圖響應給客戶端。

三、Mybatis

MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。

每個MyBatis應用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預定義的配置類的實例獲得。

用xml文件構建SqlSessionFactory實例是非常簡單的事情。推薦在這個配置中使用類路徑資源(classpath resource),但你可以使用任何Reader實例,包括用文件路徑或file://開頭的url創建的實例。MyBatis有一個實用類----Resources,它有很多方法,可以方便地從類路徑及其它位置加載資源。

MyBatis有以下的特點:

  • 支持自定義 SQL、存儲過程、高級映射;
  • 實現自動對 SQL 的參數設置;
  • 實現自動對結果集進行解析和封裝;
  • 通過 XML 或者註解進行配置和映射,大大減少代碼量;
  • 數據源的連接信息通過配置文件進行配置

1、Mybatis 整體架構

  • 配置文件:全局配置文件 mybatis-config.xml,其作用爲配置數據源,引入映射文件 Mapper.xml,映射文章的作用是配置 SQL 語句、參數、結果集封裝類型等。
  • SqlSessionFactory:相當於 Hibernate 的 SessionFactory,作用爲獲取 SqlSession,通過 newSqlSessionFactoryBuilder().build(inputStream) 來構建,inputStream用來讀取配置文件的 IO 流。
  • SqlSession:相當於 Hibernate 的 Session,作用爲執行 CRUD 操作。
  • Executor:執行器,SqlSession 通過調用它來完成具體的 CRUD,它是一個接口,提供了兩種實現,即緩存的實現、數據庫的實現。
  • Mapped Statement:在映射文件裏面配置,包含3部分內容:具體的 SQL,SQL執行所需的參數類型,SQL 執行結果的封裝類型,參數類型和結果集封裝類型包括3種,即 HashMap,基本數據類型,POJO。

四、總結

就目前來看,很多的公司依然使用SSH的框架來做一些項目,業務邏輯複雜但他們不在乎執行的效率。但我覺得SSM是優於SSH的,SSM和SSH框架的區別就在於SpringMVC和Struts2、MyBatis與Hibernate的比較。

1、SpringMVC 和 Struts2 比較

  • 機制:SpringMVC 的入口是 Servlet,Struts2 的入口是 Filter, 兩者的實現機制不同;
  • 性能:SpringMVC 稍微比 Struts 快些。SpringMVC 是基於方法的設計,而 Struts2 是基於類,每發一次請求都會實例化一個 action,每個 action 都會被注入屬性,而 SpringMVC 基於方法,粒度更細。
  • 參數傳遞:Struts2 在接受參數時,可以用屬性來接受參數,這就說明參數可被多個方法共享。SpringMVC 是基於方法的設計,傳遞參數是通過方法形參。多個方法間不能共享。
  • 設計思想上:Struts2 更加符合 OOP 的編程思想,SpringMVC 就比較謹慎,在 Servlet 上擴展

2、Mybatis 和 Hibernate 比較

  • 難易程度:Hibernate 的真正掌握要比 Mybatis 難些。Mybatis 框架相對簡單容易上手。
  • 對象管理:Hibernate 是完整的對象/關係映射解決方案,它提供了對象狀態管理的功能,使開發者不需要關心底層數據庫系統的細節。而 Mybatis 在這一塊沒有文檔說明,用戶需要自己對對象進行詳細的管理。
  • 優勢對比:Mybatis 可以進行更爲細緻的 SQL 優化,可以減少查詢字段。Hibernate 數據庫移植性很好,Mybatis 的數據庫移植性不好,不同的數據庫需要些不同的 SQL。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章