SSM、SSH -企業(yè)開發(fā)MVC開源框架

SSM

SSM框架是spring MVC ,spring和mybatis框架的整合,是標(biāo)準(zhǔn)的MVC模式,將整個(gè)系統(tǒng)劃分為表現(xiàn)層,controller層,service層,DAO層四層
使用spring MVC負(fù)責(zé)請(qǐng)求的轉(zhuǎn)發(fā)和視圖管理
spring實(shí)現(xiàn)業(yè)務(wù)對(duì)象管理,mybatis作為數(shù)據(jù)對(duì)象的持久化引擎

相比于之前的SSH(Struts+Spring+Hibernate),SSM更加輕量化和靈活,是目前比較主流的java web開發(fā)框架。

Spring MVC

  • Spring MVC 分離了控制器、模型對(duì)象、分派器以及處理程序?qū)ο蟮慕巧?,這種分離讓它們更容易進(jìn)行定制。
  • 擁有控制器,作用跟Struts類似,接收外部請(qǐng)求,解析參數(shù)傳給服務(wù)層

Spring

  • Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架
  • 容器屬于協(xié)調(diào)上下文,管理對(duì)象間的依賴,提供事務(wù)機(jī)制
  • 控制反轉(zhuǎn)和依賴注入 創(chuàng)建對(duì)象交由容器管理,達(dá)到了解耦的作用
  • Spring框架是一個(gè)分層架構(gòu),由 7 個(gè)定義良好的模塊組成。Spring 模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理 bean 的方式,
    組成Spring 框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。

mybatis

  • MyBatis是一個(gè)基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡(jiǎn)單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫中的記錄。
  • 屬于orm持久層框架,將業(yè)務(wù)實(shí)體 與數(shù)據(jù)表聯(lián)合 起來
  • 主要用來操作數(shù)據(jù)庫(數(shù)據(jù)庫的增刪改查)

IOC:控制反轉(zhuǎn)

是一種降低對(duì)象之間耦合關(guān)系的設(shè)計(jì)思想;
也叫依賴注入。利用了工廠模式將對(duì)象交給容器管理,你只需要在spring配置文件總配置相應(yīng)的bean,以及設(shè)置相關(guān)的屬性,讓spring容器來生成類的實(shí)例對(duì)象以及管理對(duì)象。在spring容器啟動(dòng)的時(shí)候,spring會(huì)把你在配置文件中配置的bean都初始化好,然后在你需要調(diào)用的時(shí)候,就把它已經(jīng)初始化好的那些bean分配給你需要調(diào)用這些bean的類(假設(shè)這個(gè)類名是A),分配的方法就是調(diào)用A的setter方法來注入,而不需要你在A里面new這些bean了。
例子,加深理解。例子:租房子,以前租房子需要一個(gè)房子一個(gè)房子找,費(fèi)時(shí)費(fèi)力,然后現(xiàn)在加入一個(gè)房屋中介,把你需要的房型告訴中介,就可以直接選到需要的房子,中介就相當(dāng)于spring容器。

AOP:面向切面編程

是面向?qū)ο箝_發(fā)的一種補(bǔ)充,它允許開發(fā)人員在不改變?cè)瓉砟P偷幕A(chǔ)上動(dòng)態(tài)的修改模型以滿足新的需求;如:動(dòng)態(tài)的增加日志、安全或異常處理等。AOP使業(yè)務(wù)邏輯各部分間的耦合度降低,提高程序可重用性,提高開發(fā)效率。

AOP只是Spring的特性,它就像OOP(面向?qū)ο缶幊?一樣是一種編程思想,并不是某一種技術(shù),AOP可以說是對(duì)OOP的補(bǔ)充和完善。OOP引入封裝、繼承和多態(tài)性等概念來建立一種對(duì)象層次結(jié)構(gòu),用以模擬公共行為的一個(gè)集合。當(dāng)我們需要為分散的對(duì)象引入公共行為的時(shí)候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關(guān)系,但并不適合定義從左到右的關(guān)系。例如日志功能。日志代碼往往水平地散布在所有對(duì)象層次中,而與它所散布到的對(duì)象的核心功能毫無關(guān)系。在OOP設(shè)計(jì)中,它導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。將程序中的交叉業(yè)務(wù)邏輯(比如安全,日志,事務(wù)等),封裝成一個(gè)切面,然后注入到目標(biāo)對(duì)象(具體業(yè)務(wù)邏輯)中去。

實(shí)現(xiàn)AOP的技術(shù),主要分為兩大類:
一是采用動(dòng)態(tài)代理技術(shù),利用截取消息的方式,對(duì)該消息進(jìn)行裝飾,以取代原有對(duì)象行為的執(zhí)行;
二是采用靜態(tài)織入的方式,引入特定的語法創(chuàng)建“方面”,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼。

原理

SpringMVC:

1.客戶端發(fā)送請(qǐng)求到DispacherServlet(分發(fā)器)
2.由DispacherServlet控制器查詢HanderMapping,找到處理請(qǐng)求的Controller
3.Controller調(diào)用業(yè)務(wù)邏輯處理后,返回ModelAndView
4.DispacherSerclet查詢視圖解析器,找到ModelAndView指定的視圖
5.視圖負(fù)責(zé)將結(jié)果顯示到客戶端

Spring:

平時(shí)開發(fā)接觸最多的估計(jì)就是IOC容器,它可以裝載bean(也就是我們Java中的類,當(dāng)然也包括service dao里面的),有了這個(gè)機(jī)制,我們就不用在每次使用這個(gè)類的時(shí)候?yàn)樗跏蓟?,很少看到關(guān)鍵字new。另外spring的aop,事務(wù)管理等等都是我們經(jīng)常用到的;

Mybatis:

mybatis是對(duì)jdbc的封裝,它讓數(shù)據(jù)庫底層操作變的透明。mybatis的操作都是圍繞一個(gè)sqlSessionFactory實(shí)例展開的。mybatis通過配置文件關(guān)聯(lián)到各實(shí)體類的Mapper文件,Mapper文件中配置了每個(gè)類對(duì)數(shù)據(jù)庫所需進(jìn)行的sql語句映射。在每次與數(shù)據(jù)庫交互時(shí),通過sqlSessionFactory拿到一個(gè)sqlSession,再執(zhí)行sql命令。

事務(wù)管理。

事務(wù)有四個(gè)特性:ACID
原子性Atomicity,一致性Consistency,隔離性Isolation,持續(xù)性Durability。

MyBatis的事務(wù)設(shè)計(jì)的重點(diǎn)是Transaction接口,包含四個(gè)方法,獲取連接,提交,回滾,關(guān)閉連接。

事務(wù)管理分別2種形式:
1.使用JDBC的事務(wù)管理機(jī)制:即利用java.sql.Connection完成對(duì)事物的操作;
2.使用MANAGED的事務(wù)管理機(jī)制,MyBatis自身不會(huì)去實(shí)現(xiàn)事務(wù)管理,而是讓容器如WebLogic,JBOSS等來實(shí)現(xiàn)事務(wù)管理。

使用方法:

要完成一個(gè)功能:
1.先寫實(shí)體類entity,定義對(duì)象的屬性,(可以參照數(shù)據(jù)庫中表的字段來設(shè)置,數(shù)據(jù)庫的設(shè)計(jì)應(yīng)該在所有編碼開始之前)。
2.寫Mapper.xml(Mybatis),其中定義你的功能,對(duì)應(yīng)要對(duì)數(shù)據(jù)庫進(jìn)行的那些操作,比如 insert、selectAll、selectByKey、delete、update等。
3.寫Mapper.java,將Mapper.xml中的操作按照id映射成Java函數(shù)。
4.寫Service.java,為控制層提供服務(wù),接受控制層的參數(shù),完成相應(yīng)的功能,并返回給控制層。
5.寫Controller.java,連接頁面請(qǐng)求和服務(wù)層,獲取頁面請(qǐng)求的參數(shù),通過自動(dòng)裝配,映射不同的URL到相應(yīng)的處理函數(shù),并獲取參數(shù),對(duì)參數(shù)進(jìn)行處理,之后傳給服務(wù)層。
6.寫JSP頁面調(diào)用,請(qǐng)求哪些參數(shù),需要獲取什么數(shù)據(jù)

SSH

SSH框架則是Struts2,Spring和Hibernate框架的整合,其中Struts2 做控制器(controller),spring 管理各層的組件,hibernate 負(fù)責(zé)持久化層。

Struts2框架執(zhí)行步驟(Struts2使用Filter嵌入):

1、客戶端初始化一個(gè)指向Servlet容器(例如Tomcat)的請(qǐng)求

2、這個(gè)請(qǐng)求經(jīng)過一系列的過濾器(Filter)(這些過濾器中有一個(gè)叫做ActionContextCleanUp的可選過濾器,這個(gè)過濾器對(duì)于Struts2和其他框架的集成很有幫助

3、接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問ActionMapper來決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action

4、如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy

5、ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調(diào)用的Action類

6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。

7、ActionInvocation實(shí)例使用命名模式來調(diào)用,在調(diào)用Action的過程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。

8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可 能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。

9、將處理結(jié)果返回給客戶端

hibernate:

優(yōu)勢(shì):

  1. 對(duì)JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。
  2. Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡(jiǎn)化DAO層的編碼工作
  3. hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來實(shí)現(xiàn)透明性。
  4. hibernate的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫,從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。

原理:
1.通過Configuration().configure();讀取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的resource="com/xx/User.hbm.xml"/>讀取并解析映射信息
3.通過config.buildSessionFactory();//創(chuàng)建SessionFactory
4.sessionFactory.openSession();//打開Sesssion
5.session.beginTransaction();//創(chuàng)建事務(wù)Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事務(wù)
8.關(guān)閉Session
9.關(guān)閉SesstionFactory

對(duì)比

1.struts太重太繁瑣,SpringMVC輕一級(jí)

2.Hibernate太重,想作的事太多了,我個(gè)人覺得,像hibernate事務(wù),完全雞肋,而緩存,大部分時(shí)候也用不上,需要用到的場(chǎng)景,完全可以自已開發(fā),更輕,而數(shù)據(jù)關(guān)系變得復(fù)雜后,hibernate越難駕馭,分布式事務(wù)的時(shí)候,還是mybatis更靈活,必要時(shí),直接寫SQL。按業(yè)務(wù)類型,混合著用。

3.springboot,本質(zhì)還是spring,坑比較多,升級(jí)版本一定要慎重,如果事務(wù)處理比較多,不建議用springboot打包的hibernate/mybatis,直接用原生會(huì)少踩坑,熟悉后開發(fā)運(yùn)維都很溜,膠水的角色。

4.Hibernate是一種O/R關(guān)系型,即完成數(shù)據(jù)庫表和持久化類之間的映射,而MyBitas是針對(duì)的SQL-Maping,個(gè)人理解是一種Hibernate把數(shù)據(jù)庫給封裝好以后,可以調(diào)用相應(yīng)的數(shù)據(jù)庫操作語句HQL,而MyBitas則是用的原始的數(shù)據(jù)庫操作語句,可以減少查詢字段。則Hibernate優(yōu)化起來相對(duì)MyBitas較難。

5.針對(duì)高級(jí)查詢,Mybatis需要手動(dòng)編寫SQL語句,以及ResultMap。而Hibernate有良好的映射機(jī)制,開發(fā)者無需關(guān)心SQL的生成與結(jié)果映射,可以更專注于業(yè)務(wù)流程。

6.Hibernate數(shù)據(jù)庫移植性很好,MyBatis的數(shù)據(jù)庫移植性不好,不同的數(shù)據(jù)庫需要寫不同SQL。

7.SSM會(huì)比SSH更輕量,更靈活。但是SSH封裝性更多一些,開發(fā)更為輕松

8.SSM和SSH不同主要在MVC實(shí)現(xiàn)方式,以及ORM持久化方面不同(Hiibernate與Mybatis)。SSM越來越輕量級(jí)配置,將注解開發(fā)發(fā)揮到極致,且ORM實(shí)現(xiàn)更加靈活,SQL優(yōu)化更簡(jiǎn)便;而SSH較注重配置開發(fā),其中的Hiibernate對(duì)JDBC的完整封裝更面向?qū)ο?,?duì)增刪改查的數(shù)據(jù)維護(hù)更自動(dòng)化,但SQL優(yōu)化方面較弱,且入門門檻稍高。

9.JPA hibernate/mybatis都是面向sql的,面向nosql,如mongo/elasticsearch/solr,通用的crud,用jpa很高效,一套方法打遍天,當(dāng)然太細(xì)的控制jpa就不行了,比如elasticsearch/solr想高亮,實(shí)際大部分nosql的服務(wù)對(duì)性能和事務(wù)的要求都不高,如無必要,還是用nodejs,python之類的開發(fā)更高效。

10.netty,可以把ssh的網(wǎng)絡(luò)服務(wù)(在mvc之下,網(wǎng)絡(luò)socket的部分)接管,早期還要啟個(gè)輕量的tomcat/jboss/glassfish之類,現(xiàn)在多是直接啟netty。jersey開發(fā)restful更高效,足以代替SpringMVC

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容