1. 程式人生 > >Java【關於SSM框架體會和小總結】

Java【關於SSM框架體會和小總結】

前言:使用SSM(spring、SpringMVC和Mybatis)已經有三個多月了,專案在技術上已經沒有什麼難點了,基於現有的技術就可以實現想要的功能,當然肯定有很多可以改進的地方。之前沒有記錄SSM整合的過程,只寫了個搭建Maven過程,這次剛剛好基於自己的一個小專案重新搭建了一次,而且比專案搭建的要更好一些。以前解決問題的過程和方法並沒有及時記錄,以後在自己的小專案中遇到我再整理分享一下。這次,先說說三大框架的理解。個人認為使用框架並不是很難,關鍵要理解其思想,這對於我們提高程式設計水平很有幫助。不過,如果用都不會,談思想就變成紙上談兵了!!!先技術,再思想。實踐出真知。

1、基本概念

1.1、Spring

Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為 瞭解決企業應用開發的複雜性而建立的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。 
簡單來說,Spring是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器 
框架。

1.2、SpringMVC

Spring MVC屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裡面。Spring MVC 分離了控制器、模型物件、分派器以及處理程式物件的角色,這種分離讓它們更容易進行定製。

1.3、Mybatis

MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。MyBatis是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始對映,將介面和 Java 的POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。

2、Maven的搭建

3、SSM整合的問題和對框架的理解

————–感覺有了框架之後編寫程式碼的效率提高了,那是因為框架封裝了普通專案中程式設計師需要重複書寫的程式碼和簡化了呼叫過程,就比如說在傳統的jsp專案中,我們的controller接收到前端的請求然後程式設計師就需要去開發Dao層,裡面還涉及資料庫的連線和儲存過程的程式碼,大部分都是冗餘的程式碼,而有了SSM框架後就極大的簡化了程式猿在controller以下層的開發,只需要一個service層和mapper層就行了,mapper層用來連線mapper.xml檔案的,而直接用mapper.xml做sql語句的開發就行了,而什麼資料庫連線的和儲存的過程都直接由mybatis負責了,你只需要負責傳遞形參和接收返回資料就行了,這樣就完成了一次完整的資料庫互動!

————-而下面我就來說說框架中的那些思想是怎麼在簡化程式碼的過程中體現出來的:

一、分享Iteye的開濤對Ioc的精彩講解

1.1、IoC是什麼

Ioc—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制如何理解好Ioc呢?理解好Ioc的關鍵是要明確“誰控制誰,控制什麼,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了”,那我們來深入分析一下: 
 ●誰控制誰,控制什麼:傳統Java SE程式設計,我們直接在物件內部通過new進行建立物件,是程式主動去建立依賴物件;而IoC是有專門一個容器來建立這些物件,即由Ioc容器來控制對 象的建立;誰控制誰?當然是IoC 容器控制了物件;控制什麼?那就是主要控制了外部資源獲取(不只是物件包括比如檔案等)。 
 ●為何是反轉,哪些方面反轉了:有反轉就有正轉,傳統應用程式是由我們自己在物件中主動控制去直接獲取依賴物件,也就是正轉;而反轉則是由容器來幫忙建立及注入依賴物件;為何是反轉?因為由容器幫我們查詢及注入依賴物件,物件只是被動的接受依賴物件,所以是反轉;哪些方面反轉了?依賴物件的獲取被反轉了。 
 用圖例說明一下,傳統程式設計如圖2-1,都是主動去建立相關物件然後再組合起來: 
 圖1-1 傳統應用程式示意圖 
 當有了IoC/DI的容器後,在客戶端類中不再主動去建立這些物件了,如圖2-2所示: 
 圖1-2有IoC/DI容器後程序結構示意圖 
 1.2、IoC能做什麼 
 IoC 不是一種技術,只是一種思想,一個重要的面向物件程式設計的法則,它能指導我們如何設計出鬆耦合、更優良的程式。傳統應用程式都是由我們在類內部主動建立依賴物件,從而導致類與類之間高耦合,難於測試;有了IoC容器後,把建立和查詢依賴物件的控制權交給了容器,由容器進行注入組合物件,所以物件與物件之間是 鬆散耦合,這樣也方便測試,利於功能複用,更重要的是使得程式的整個體系結構變得非常靈活。 
 其實IoC對程式設計帶來的最大改變不是從程式碼上,而是從思想上,發生了“主從換位”的變化。應用程式原本是老大,要獲取什麼資源都是主動出擊,但是在IoC/DI思想中,應用程式就變成被動的了,被動的等待IoC容器來建立並注入它所需要的資源了。 
 IoC很好的體現了面向物件設計法則之一—— 好萊塢法則:“別找我們,我們找你”;即由IoC容器幫物件找相應的依賴物件並注入,而不是由物件主動去找。 
 1.3、IoC和DI 
 DI—Dependency Injection,即“依賴注入”:元件之間依賴關係由容器在執行期決定,形象的說,即由容器動態的將某個依賴關係注入到元件之中。依賴注入的目的並非為軟體系統帶來更多功能,而是為了提升元件重用的頻率,併為系統搭建一個靈活、可擴充套件的平臺。通過依賴注入機制,我們只需要通過簡單的配置,而無需任何程式碼就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實現。 
 理解DI的關鍵是:“誰依賴誰,為什麼需要依賴,誰注入誰,注入了什麼”,那我們來深入分析一下: 
 ●誰依賴於誰:當然是應用程式依賴於IoC容器; 
 ●為什麼需要依賴:應用程式需要IoC容器來提供物件需要的外部資源; 
 ●誰注入誰:很明顯是IoC容器注入應用程式某個物件,應用程式依賴的物件; 
 ●注入了什麼:就是注入某個物件所需要的外部資源(包括物件、資源、常量資料)。 
 IoC和DI由什麼關係呢?其實它們是同一個概念的不同角度描述,由於控制反轉概念比較含糊(可能只是理解為容器控制物件這一個層面,很難讓人想到誰來維護物件關係),所以2004年大師級人物Martin Fowler又給出了一個新的名字:“依賴注入”,相對IoC 而言,“依賴注入”明確描述了“被注入物件依賴IoC容器配置依賴物件”。 
 看過很多對Spring的Ioc理解的文章,好多人對Ioc和DI的解釋都晦澀難懂,反正就是一種說不清,道不明的感覺,讀完之後依然是一頭霧水,感覺就是開濤這位技術牛人寫得特別通俗易懂,他清楚地解釋了IoC(控制反轉) 和DI(依賴注入)中的每一個字,讀完之後給人一種豁然開朗的感覺。我相信對於初學Spring框架的人對Ioc的理解應該是有很大幫助的。 
 二、分享Bromon的blog上對IoC與DI淺顯易懂的講解 
 2.1、IoC(控制反轉) 
 首先想說說IoC(Inversion of Control,控制反轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係。這是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看哪裡有長得漂亮身材又好的mm,然後打聽她們的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,投其所好送其所要,然後嘿嘿……這個過程是複雜深奧的,我們必須自己設計和麵對每個環節。傳統的程式開發也是如此,在一個物件中,如果要使用另外的物件,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要將物件銷燬(比如Connection等),物件始終會和其他的介面或類藕合起來。 
 那麼IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像齊達內之類的,然後婚介就會按照我們的要求,提供一個mm,我們只需要去和她談戀愛、結婚就行了。簡單明瞭,如果婚介給我們的人選不符合要求,我們就會丟擲異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統執行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷燬都由 spring來控制,也就是說控制物件生存週期的不再是引用它的物件,而是spring。對於某個具體的物件而言,以前是它控制其他物件,現在是所有物件都被spring控制,所以這叫控制反轉。 
 2.2、DI(依賴注入) 
 IoC的一個重點是在系統執行中,動態的向某個物件提供它所需要的其他物件。這一點是通過DI(Dependency Injection,依賴注入)來實現的。比如物件A需要操作資料庫,以前我們總是要在A中自己編寫程式碼來獲得一個Connection物件,有了 spring我們就只需要告訴spring,A中需要一個Connection,至於這個Connection怎麼構造,何時構造,A不需要知道。在系統執行時,spring會在適當的時候製造一個Connection,然後像打針一樣,注射到A當中,這樣就完成了對各個物件之間關係的控制。A需要依賴 Connection才能正常執行,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。那麼DI是如何實現的呢? Java 1.3之後一個重要特徵是反射(reflection),它允許程式在執行的時候動態的生成物件、執行物件的方法、改變物件的屬性,spring就是通過反射來實現注入的。 
 理解了IoC和DI的概念後,一切都將變得簡單明瞭,剩下的工作只是在spring的框架中堆積木而已。

二、分享Bromon的blog上對IoC與DI淺顯易懂的講解

2.1、IoC(控制反轉) 
首先想說說IoC(Inversion of Control,控制反轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係。這是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看哪裡有長得漂亮身材又好的mm,然後打聽她們的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,投其所好送其所要,然後嘿嘿……這個過程是複雜深奧的,我們必須自己設計和麵對每個環節。傳統的程式開發也是如此,在一個物件中,如果要使用另外的物件,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要將物件銷燬(比如Connection等),物件始終會和其他的介面或類藕合起來。 
那麼IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像齊達內之類的,然後婚介就會按照我們的要求,提供一個mm,我們只需要去和她談戀愛、結婚就行了。簡單明瞭,如果婚介給我們的人選不符合要求,我們就會丟擲異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統執行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷燬都由 spring來控制,也就是說控制物件生存週期的不再是引用它的物件,而是spring。對於某個具體的物件而言,以前是它控制其他物件,現在是所有物件都被spring控制,所以這叫控制反轉。

  • Ioc和DI其實是一種思想,並不是具體的技術,當我們在搭建SSM專案的時候就是用到了這種思想。
  • 首先Spring是個大容器,可以把整個專案都包含進去,而Ioc和DI就是運轉整個專案的核心思想。
  • 專案的執行和週期由Ioc控制,事件的請求和反應由DI控制
  • 就比如:org.springframework.web.servlet.DispatcherServlet前端配置類,當前端發出請求後,Ioc會控制這個請求的接收,通過spring中的類來找到controller,而不是使用者自己去接收前端請求,這就是Ioc的一個應用 
    比如就是有一個商場類,人類要去買東西,有了依賴注入後,我們就不需要New一個商場類、人類、和具體商品類,我們只需要在配置中配好,然後呼叫具體的購買方法,傳入想買的物品類,就可以通過同期得到想要的結果了,說白了,就是讓你少New了幾個類,但是在大專案中就可以節省程式設計師很多精力,更加專注的開發具體邏輯。 
    詳情例子:http://blog.csdn.net/u014563989/article/details/55188673
  • DI(依賴注入)的思想可以在建立資料庫連線上體現,整個專案穿件連線時並不是當需要連線時new一個連線,而是專案在配置的時候建立好連線,當要用的時候,DI會給程式去用,而程式在什麼時候用和怎麼用時開發者不知道的,但最後還是實現了功能。

三、面向切面程式設計(AOP)提供另外一種角度來思考程式結構,通過這種方式彌補了面向物件程式設計(OOP)的不足

除了類(classes)以外,AOP提供了切面。切面對關注點進行模組化,例如橫切多個型別和物件的事務管理 
Spring的一個關鍵的元件就是AOP框架,可以自由選擇是否使用AOP 
提供宣告式企業服務,特別是為了替代EJB宣告式服務。最重要的服務是宣告性事務管理,這個服務建立在Spring的抽象事物管理之上.

允許使用者實現自定義切面,用AOP來完善OOP的使用可以把Spring AOP看作是對Spring的一種增強

四、處理器介面卡、對映器

就一個作用,讓前端控制器找到controller. 
處理對映器的作用:將bean的name作為url進行查詢 
處理介面卡的作用:就是按要求的規則去執行handler

有了註解的對映器和介面卡後,程式設計師只需要配合著註解@Controller就可以省去了在非註解對映器中還要編寫controller名字的麻煩,這也是非註解的對映器是怎麼找到controller的方法。

五、目前總結

現在對SSM框架的理解主要是以上這些東西,但其實還有很多細節我沒有搞清楚,比如Mybatis的原理還有mybatis中寫複雜的sql語句,然後還就是對,我以後會持續更新這個部落格,把自己在實戰專案和學習中的理解和心得寫在這裡。