Struts/Spring/Hibernate三大開源框架底層機制以及原理







Struts1的工作原理

Struts1工作原理圖:


1、初始化:struts框架的總控制器ActionServlet是一個Servlet,它在web.xml中配置成自動啓動的Servlet,在啓動時總控制器會讀取配置文件(struts-config.xml)的配置信息,爲struts中不同的模塊初始化相應的對象。(面向對象思想)

2、發送請求:用戶提交表單或通過URLWEB服務器提交請求,請求的數據用HTTP協議傳給web服務器。

3form填充:struts的總控制器ActionServlet在用戶提交請求時將數據放到對應的form對象中的成員變量中。

4、派發請求:控制器根據配置信息對象ActionConfig將請求派發到具體的Action,對應的formBean一併傳給這個Action中的excute()方法。

5、處理業務:Action一般只包含一個excute()方法,它負責執行相應的業務邏輯(調用其它的業務模塊)完畢後返回一個ActionForward對象。服務器通過ActionForward對象進行轉發工作。

6、返回響應:Action將業務處理的不同結果返回一個目標響應對象給總控制器。

7、查找響應:總控制器根據Action處理業務返回的目標響應對象,找到對應的資源對象,一般情況下爲jsp頁面。

8、響應用戶:目標響應對象將結果傳遞給資源對象,將結果展現給用戶。

ssh框架啓動流程 
系統從職責上分爲四層:表示層、業務邏輯層、數據持久層和域模塊層。其中使用Struts作爲系統的整體基礎架構,負責MVC的分離,在Struts框架的模型部分,利用Hibernate框架對持久層提供支持,業務層用Spring支持。具體做法是:用面向對象的分析方法根據需求提出一些模型,將這些模型實現爲基本的Java對象,然後編寫基本的DAO接口,並給出HibernateDAO實現,採用 Hibernate架構實現的DAO類來實現Java類與數據庫之間的轉換和訪問,最後由Spring完成業務邏輯。

系統的基本業務流程是:在表示層中,首先通過JSP頁面實現交互界面,負責傳送請求(Request)和接收響應(Response),然後Struts根據配置文件(struts-config.xml)ActionServlet接收到的Request委派給相應的Action處理。在業務層中,管理服務組件的 Spring IoC容器負責向Action提供業務模型(Model)組件和該組件的協作對象數據處理(DAO)組件完成業務邏輯,並提供事務處理、緩衝池等容器組件以提升系統性能和保證數據的完整性。而在持久層中,則依賴於Hibernate的對象化映射和數據庫交互,處理DAO組件請求的數據,並返回處理結果。

  採用上述開發模型,不僅實現了視圖、控制器與模型的徹底分離,而且還實現了業務邏輯層與持久層的分離。這樣無論前端如何變化,模型層只需很少的改動,並且數據庫的變化也不會對前端有所影響,大大提高了系統的可複用性。而且由於不同層之間耦合度小,有利於團隊成員並行工作,大大提高了開發效率。

Struts1struts2有什麼不同

1.Action
 Stuts1
要求Action類繼承一個抽象基類。Struts1的一個普通問題是使用抽象類編程而不是接口。Struts2 Action類可以實現一個Action接口,也可以實現其它接口,使可選和定製的服務成爲可能。Struts2提供一個ActionSupport基類去實現常用的接口。Action 接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2Action對象。

2. 線程模式:Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。 Struts 2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。

3.Servlet依賴:Struts1 Action依賴於Servlet API,因爲當一個Action被調用時,HttpServletResquestHttpServletResponse被傳遞給execute方法,即Action依賴了容器,測試變得非常麻煩。Struts2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的requestresponse。但是,其它的元素減少或者消除了直接訪問HttpServletRequsetHttpServletResponse的必要性。 4.捕獲輸入:Struts1使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因爲其它JavaBean不能用作ActionForm,開發者經常創建多餘的類捕獲輸入。動態Bean可以作爲創建傳統ActionForm的選擇,但是,開發者可能是在重新描述已經存在的JavaBean,仍然會導致有冗餘的javabeanStruts2直接使用Action屬性作爲輸入屬性,消除了對第二輸入對象的需求。Action屬性能夠通過web頁面上的taglibs訪問。Struts2也支持ActionForm模式。(Struts2用普通的POJO來接收數據)

5.表達式語言:Struts1整合了JSTL,但對集合和索引屬性的支持很弱。Struts2可以是使用JSTL,但是也支持一個更加強大和靈活的表達式語言“Object Graph Notation Language”(OGNL).

6. 綁定值到頁面(view: Struts1使用標準JSP機制把對象綁定到頁面中來訪問,Struts1要傳遞值的時候必須往request裏放、往session裏放,然後再傳遞到jsp裏面,銅鼓el表達式得到。Struts2使用“ValueStack”技術,使taglib能夠訪問值而不需要把你的頁面和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面。值棧技術非常著名。不需要request、不需要session,直接從Action中取值。

7.類型轉換: Struts1 ActionForm屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。
 

8.校驗:Struts1支持在ActionFormvalidate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。Struts2支持通過validate方法和Xwork校驗框架來進行校驗。Xwork校驗框架使用爲屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性。

9.Action執行的控制:Struts1支持每一個模塊有單獨的RequestProcessors(生命週期),但是模塊中的所有Action必須共享相同的生命週期。(服務器重啓時,Action生命週期結束,即生命週期無法控制)。Struts2支持通過攔截器堆棧(Interceptor Stacks)爲每一個Action創建不同的生命週期。堆棧能夠根據需要和不同的Action一起使用。(可以控制Action的生命週期)

簡單的說:
struts1
struts2的核心原理不同:
struts1.X
是基於servlet

struts2
xwork的變體:他的核心是
filter
struts1
是單例模式開發,

struts2
是多例模式。

struts1
的單例模式好處是節省內存,缺點是併發性查,非同步。

struts2
好處是線程安全是同步的每次使用開闢新的內存空間,
缺點是佔用資源多。

 

 

Model1的原理:

Struts1的工作原理:


2

它引入了控制器這個概念,控制器一般由servlet來擔任,客戶端的請求不再直接送給一個處理業務邏輯的JSP頁面,而是送給這個控制器,再由控制器根據具體的請求調用不同的事務邏輯,並將處理結果返回到合適的頁面。因此,這個servlet控制器爲應用程序提供了一個進行前-後端處理的中樞。一方面爲輸入數據的驗證、身份認證、日誌及實現國際化編程提供了一個合適的切入點;另一方面也提供了將業務邏輯從JSP文件剝離的可能。業務邏輯從JSP頁面分離後,JSP文件蛻變成一個單純完成顯示任務的東西,這就是常說的View。而獨立出來的事務邏輯變成人們常說的Model,再加上控制器Control本身,就構成了MVC模式。實踐證明,MVC模式爲大型程序的開發及維護提供了巨大的便利。


其實,MVC開始並不是爲Web應用程序提出的模式,傳統的MVC要求M將其狀態變化通報給V,但由於Web瀏覽器工作在典型的拉模式而非推模式,很難做到這一點。因此有些人又將用於Web應用的MVC稱之爲MVC2。正如上面所提到的MVC是一種模式,當然可以有各種不同的具體實現,包括您自己就可以實現一個體現MVC思想的程序框架,Struts就是一種具體實現MVC2的程序框架。它的大致結構如圖三所示:




圖三


圖三基本勾勒出了一個基於Struts的應用程序的結構,從左到右,分別是其表示層(view)、控制層(controller)、和模型層(Model)。其表示層使用Struts標籤庫構建。來自客戶的所有需要通過框架的請求統一由叫ActionServletservlet接收(ActionServlet Struts已經爲我們寫好了,只要您應用沒有什麼特別的要求,它基本上都能滿足您的要求),根據接收的請求參數和Struts配置(struts-config.xml)ActionMapping,將請求送給合適的Action去處理,解決由誰做的問題,它們共同構成Struts的控制器。Action則是Struts應用中真正幹活的組件,開發人員一般都要在這裏耗費大量的時間,它解決的是做什麼的問題,它通過調用需要的業務組件(模型)來完成應用的業務,業務組件解決的是如何做的問題,並將執行的結果返回一個代表所需的描繪響應的JSP(或Action)的ActionForward對象給ActionServlet以將響應呈現給客戶。


過程如圖四所示:




圖四


這裏要特別說明一下的是:就是Action這個類,上面已經說到了它是Struts中真正幹活的地方,也是值得我們高度關注的地方。可是,關於它到底是屬於控制層還是屬於模型層,存在兩種不同的意見,一種認爲它屬於模型層,如:《JSP Web編程指南》;另一些則認爲它屬於控制層如:《ProgrammingJakarta Struts》、《Mastering Jakarta Struts》和《Struts Kick Start》等認爲它是控制器的一部分,還有其他一些書如《Strutsin Action》也建議要避免將業務邏輯放在Action類中,也就是說,圖3Action後的括號中的內容應該從中移出,但實際中確有一些系統將比較簡單的且不打算重用的業務邏輯放在Action中,所以在圖中還是這樣表示。顯然,將業務對象從Action分離出來後有利於它的重用,同時也增強了應用程序的健壯性和設計的靈活性。因此,它實際上可以看作是ControllerModel的適配器,如果硬要把它歸於那一部分,筆者更傾向於後一種看法,即它是Controller的一部分,換句話說,它不應該包含過多的業務邏輯,而應該只是簡單地收集業務方法所需要的數據並傳遞給業務對象。實際上,它的主要職責是:

·  校驗前提條件或者聲明

·  調用需要的業務邏輯方法

·  檢測或處理其他錯誤

·  路由控制到相關視圖

上面這樣簡單的描述,初學者可能會感到有些難以接受,下面舉個比較具體的例子來進一步幫助我們理解。如:假設,我們做的是個電子商務程序,現在程序要完成的操作任務是提交定單並返回定單號給客戶,這就是關於做什麼的問題,應該由Action類完成,但具體怎麼獲得數據庫連接,插入定單數據到數據庫表中,又怎麼從數據庫表中取得這個定單號(一般是自增數據列的數據),這一系列複雜的問題,這都是解決怎麼做的問題,則應該由一個(假設名爲orderBo)業務對象即Model來完成。orderBo可能用一個返回整型值的名爲submitOrder的方法來做這件事,Action則是先校驗定單數據是否正確,以免常說的垃圾進垃圾出;如果正確則簡單地調用orderBosubmitOrder方法來得到定單號;它還要處理在調用過程中可能出現任何錯誤;最後根據不同的情況返回不同的結果給客戶。


二、爲什麼要使用Struts框架


既然本文的開始就說了,自己可以建這種框架,爲什麼要使用Struts呢?我想下面列舉的這些理由是顯而易見的:首先,
它是建立在MVC這種公認的好的模式上的StrutsMVC上都有涉及,但它主要是提供一個好的控制器和一套定製的標籤庫上,也就是說它的着力點在CV上,因此,它天生就有MVC所帶來的一系列優點,如:結構層次分明,高可重用性,增加了程序的健壯性和可伸縮性,便於開發與設計分工,提供集中統一的權限控制、校驗、國際化、日誌等等;其次,它是個開源項目得到了包括它的發明者Craig R.McClanahan在內的一些程序大師和高手持續而細心的呵護,並且經受了實戰的檢驗,使其功能越來越強大,體系也日臻完善;最後,是它對其他技術和框架顯示出很好的融合性。如,現在,它已經與tiles融爲一體,可以展望,它很快就會與JSF等融會在一起。當然,和其他任何技術一樣,它也不是十全十美的,如:它對類和一些屬性、參數的命名顯得有些隨意,給使用帶來一些不便;還有如Actionexecute方法的只能接收一個ActionForm參數等。但瑕不掩瑜,這些沒有影響它被廣泛使用

 

爲什麼使用Struts2 ?

新版本的Struts2.0struts action架構和webwork的融合體.依照Struts2.0.1的發佈公告,一些關鍵特性如下 :

 

l    設計簡單: 使用抽象類而不是接口是Struts1的一個設計上的問題,這已經在Struts2中得到了解決.Struts2中絕大多數類都是基於接口的,並且它的絕大多數核心接口都是獨立於HTTP.Struts2Action類是獨立於框架的,可視爲單純的POJO.框架的組件都設法保持鬆耦合

 

l    單純的Action : Action都是單純的POJO.任何含有execute()方法的java類都可以當作Action類來使用.甚至我們始終都不需要實現接口.反轉控制會在開發Action類的時候得到介紹過,這能讓Action中立於底層框架.

 

l    不再使用ActionForm : ActionForm特性不再在Structs2中出現.簡單的JavaBean即可對Action直接傳遞參數.不再需要全部使用String類型的參數.

 

l    簡單的測試 : Struts2Action是獨立於HTTP並且中立於框架的.這使得Struts2的程序可以很容易的在沒有模擬對象的情況下測試.

 

l    巧妙的默認值 : 大多數配置元素都設有一個根據需要設定的默認值.甚至根據需要基於XML的默認配置文件都可以進行重寫.

 

l    改良的結果集 : 不像Struts1中的ActionForward,Struts2的結果集靈活的提供了多種類型的輸出,事實上這促進了響應的準備工作.

 

l    更好的標籤特性 : Struts2可以添加樣式表驅動標記,這使我們創建相同的頁面僅用更少的代碼.Struts2的標籤更有效而且是面向結果的.Struts2的標籤標記可以通過修改基礎樣式表來修改.個別的標籤標記可以通過編輯FreeMarker的模板來修改.JSPFreeMarker都完全得到了支持.

 

l    引入註釋 : Struts2程序中,除了XMLJavaproperties 配置文件外,Java 5的註釋也可以作爲一種選擇.註釋使得XML的使用降至最低.

 

l    有狀態的Checkbox : Struts2中的checkbox不需要對false值進行特殊處理.

 

l    快速開始 : 很多改變無需重啓web容器即可實現.

 

l    自定義控制器 : Struts1可以自定義每一個模塊的請求處理器,如果需要,Struts2可以自定義每一個Action的請求處理.

 

l    易與Spring整合 : Struts2ActionSpring是友好的,只需添加Springbean

 

l    輕巧的插件 : Struts2可以通過添加一個Jar文件來進行擴展,不再需要手動配置!

 

l    支持AJAX : AJAX主題對提升程序交互有着重要的意義.Struts2框架提供了一套標籤來AJAX化你的程序甚至DOJO.AJAX特性包括:

1.      AJAX客戶端驗證.

2.      支持遠程表單提交.(同樣適用於submit標籤)

3.      先進的div模板提供動態重載部份HTML

4.      先進的模板提供遠程加載和計算Javascript的能力.

5.      AJAX-only選項卡面板的實現

6.      豐富的發佈/訂閱事件模型

7.      自動交互完善標籤

 

深入全面闡釋Struts 2的方方面面

一、 Struts概述

Struts是一個用來開發 Model2應用程序的框架。這個框架可以提高開發工作的速度,因爲它提供的下面這些功能解決了 Web應用程序開發過程中的一些常見問題:

對頁面導航活動進行管理; 對來自用戶的輸入數據進行合法性驗證; 統一的佈局; 可擴展性; 國際化和本地化; 支持 Ajax技術。

因爲 Struts是一個 Model 2框架,所以在使用 Struts時還應該遵守以下幾條不成文的規定。

不要在 JSP頁面裏嵌入 Java代碼,應該把所有的業務邏輯包含在一些被稱爲“動作類”( action class)的 Java類裏。 JSP頁面裏使用 Expression Language OGNL)去訪問有關的模型對象。 儘量避免編寫自定義標籤(因爲自定義標籤的代碼比較難以編寫)。

二、升級到 Struts 2

你也許用過 Struts 1編程,這裏提供了一個關於 Struts2 新功能的簡要介紹。

Struts 1裏需要使用一個像 ActionServlet 類這樣的東西作爲 servlet控制器; Struct 2使用了一個過濾器來完成同樣的任務。 Struts 2裏沒有任何動作表單。在 Struts 1裏,每個 HTML表單都對應着一個 ActionForm 實例,你可以從動作類訪問這個動作表單,並用它來填充數據傳輸對象。在 Struts 2 裏, HTML表單將被直接映射爲一個 POJO,而不再需要你創建一個數據傳輸對象,因爲沒有動作表單,維護工作變得簡單容易了,你不再需要與那麼多的類打交道。 問題來了:沒有了動作表單,怎樣才能在 Struts 2裏通過編程對用戶輸入進行合法性驗證呢?答案是把驗證邏輯編寫在動作類裏 Struts 1通過幾個標籤庫提供了一批定製標籤供程序員在 JSP頁面裏使用,其中最重要的是 HTML標籤庫、 Bean標籤庫和 Logic標籤庫。 Servlet 2.4裏的 JSTL EL Expression Language ,表達式語言)經常被用來代替 Bean Logic標籤庫。 Struts 2爲程序員準備了一個應有盡有的標籤庫,你不再需要 JSTL但在某些場合你可能仍需要 EL Struts 1裏,你還需要用到一些 Struts配置文件,其中最主要的是存放在各 Web應用程序裏的 WEB-INF子目錄裏的 struts-config.xml(默認文件名)。在 Struts 2裏,你仍需要用到多個配置文件,但必須把它們存放在 WEB-INF/classes子目錄或它的某個下級子目錄裏。 要想使用 Struts 2 ,你的系統裏必須有 Java 5 Servlet 2.4 (或更高版本)。之所以需要有 Java 5,是因爲 Java 5裏新增加的註解在 Struts 2裏扮演着重要角色。我們撰寫本書時, Java 6已經發布, Java 7也指日可待,你很可能已經在使用 Java 5 Java 6了。 Struts 1 裏,動作類必須擴展自org.apache.struts.action.Action 類。在 Struts 2 裏,任何一個 POJO 都可以是一個動作類。不過,我們將在本書第 3 章說明,在 Struts 2 裏最好對 ActionSupport 類進行擴展。在此基礎上,可用一個動作類來完成相關的動作。 Struts 2 JSP頁面裏使用 OGNL來顯示各種對象模型,而不再是 JSP         EL JSTL

原本是 Struts 1組件之一的 Tiles現在已經發展爲一個獨立的 Apache

HTTP沒有“類型”的概念,在HTTP請求裏發送的值都是字符串。在把表單字段映射到非 String 類型的動作屬性時, Struts會自動對這些值進行必要的轉換。這一章將解釋 Struts如何完成這類轉換,你還將學到如何爲更加複雜的情

spring工作機制及爲什麼要用?

  1.springmvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模塊負責對請求進行真正的處理工作。

  2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.

  3.DispatcherServlet請求提交到目標Controller

  4.Controller進行業務邏輯處理後,會返回一個ModelAndView

  5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象

  6.視圖對象負責渲染返回給客戶端。

  爲什麼用:

  AOP 讓開發人員可以創建非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP後,公共服務(比如日誌、持久性、事務等)就可以分解成方面並應用到域對象上,同時不會增加域對象的對象模型的複雜性。

  IOC 允許創建一個可以構造對象的應用環境,然後向這些對象傳遞它們的協作對象。正如單詞 倒置所表明的,IOC 就像反過來的JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straightconstruction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。

  Spring即使一個AOP框架,也是一IOC容器 Spring 最好的地方是它有助於您替換對象。有了Spring,只要用JavaBean屬性和配置文件加入依賴性(協作對象)。然後可以很容易地在需要時替換具有類似接口的協作對象。

  Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring模塊構建在覈心容器之上,核心容器定義了創建、配置和管理bean 的方式,如圖 1 所示。

  組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:

  核心容器:核心容器提供 Spring框架的基本功能。核心容器的主要組件是BeanFactory,它是工廠模式的實現。BeanFactory使用控制反轉(IOC)模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。

  Spring 上下文:Spring 上下文是一個配置文件,向 Spring框架提供上下文信息。Spring上下文包括企業服務,例如 JNDIEJB、電子郵件、國際化、校驗和調度功能。

  Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了Spring框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOPSpring  AOP 模塊爲基於Spring的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴EJB組件,就可以將聲明性事務管理集成到應用程序中。

  Spring DAOJDBC DAO抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。SpringDAO的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。

  Spring ORMSpring 框架插入了若干個 ORM 框架,從而提供了 ORM的對象關係工具,其中包括JDOHibernate iBatis SQL Map。所有這些都遵從 Spring 的通用事務和DAO異常層次結構。

  Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,爲基於Web的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts的集成。Web模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。

  Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC實現。通過策略接口,MVC框架變成爲高度可配置的,MVC 容納了大量視圖技術,其中包括JSPVelocityTilesiText POI

  Spring 框架的功能可以用在任何 J2EE服務器中,大多數功能也適用於不受管理的環境。Spring核心要點是:支持不綁定到特定 J2EE服務的可重用業務和數據訪問對象。毫無疑問,這樣的對象可以在不同 J2EE 環境 (WebEJB)、獨立應用程序、測試環境之間重用。

  共2: 1 [2]

  內容導航

  第 1 頁:Hibernate工作原理及用的理由(1) 2 頁:Hibernate工作原理及用的理由(2)

   IOC AOP

  控制反轉模式(也稱作依賴性介入)的基本概念是:不創建對象,但是描述創建它們的方式。在代碼中不直接與對象和服務連接,但在配置文件中描述哪一個組件需要哪一項服務。容器(在Spring框架中是 IOC 容器) 負責將這些聯繫在一起。

  在典型的 IOC 場景中,容器創建了所有對象,並設置必要的屬性將它們連接在一起,決定什麼時間調用方法。下表列出了IOC的一個實現模式。

  Spring 框架的 IOC 容器採用類型 2 和類型3 實現。

  面向方面的編程

AOP是一種編程技術,它允許程序員對橫切關注點或橫切典型的職責分界線的行爲(例如日誌和事務管理)進行模塊化。

AOP的核心構造是方面,它將那些影響多個類的行爲封裝到可重用的模塊中。

  AOP IOC是補充性的技術,它們都運用模塊化方式解決企業應用程序開發中的複雜問題。在典型的面向對象開發方式中,可能要將日誌記錄語句放在所有方法和Java類中才能實現日誌功能。在 AOP方式中,可以反過來將日誌服務模塊化,並以聲明的方式將它們應用到需要日誌的組件上。當然,優勢就是Java類不需要知道日誌服務的存在,也不需要考慮相關的代碼。所以,用 Spring AOP 編寫的應用程序代碼是鬆散耦合的。

  AOP 的功能完全集成到了 Spring 事務管理、日誌和其他各種特性的上下文中。

  IOC 容器

  Spring 設計的核心是 org.springframework.beans 包,它的設計目標是與JavaBean組件一起使用。這個包通常不是由用戶直接使用,而是由服務器將其用作其他多數功能的底層中介。下一個最高級抽象是BeanFactory接口,它是工廠設計模式的實現,允許通過名稱創建和檢索對象。BeanFactory也可以管理對象之間的關係。

  BeanFactory 支持兩個對象模型。

  單態模型提供了具有特定名稱的對象的共享實例,可以在查詢時對其進行檢索。Singleton是默認的也是最常用的對象模型。對於無狀態服務對象很理想。

  原型模型確保每次檢索都會創建單獨的對象。在每個用戶都需要自己的對象時,原型模型最適合。

  bean 工廠的概念是 Spring 作爲 IOC容器的基礎。IOC將處理事情的責任從應用程序代碼轉移到框架。正如我將在下一個示例中演示的那樣,Spring 框架使用JavaBean屬性和配置數據來指出必須設置的依賴關係。

  BeanFactory 接口

  因爲org.springframework.beans.factory.BeanFactory是一個簡單接口,所以可以針對各種底層存儲方法實現。最常用的BeanFactory 定義是 XmlBeanFactory,它根據XML 文件中的定義裝入 bean,如清單 1 所示。

  清單 1. XmlBeanFactory

  BeanFactory factory = new XMLBeanFactory(newFileInputSteam(“mybean.xml”));

  在 XML 文件中定義的 Bean 是被消極加載的,這意味在需要 bean 之前,bean本身不會被初始化。要從BeanFactory 檢索 bean,只需調用 getBean() 方法,傳入將要檢索的 bean的名稱即可,如清單 2所示。

  清單 2. getBean()

  MyBean mybean = (MyBean) factory.getBean(“mybean”);

  每個 bean 的定義都可以是 POJO (用類名和 JavaBean 初始化屬性定義)或FactoryBeanFactoryBean 接口爲使用 Spring 框架構建的應用程序添加了一個間接的級別。

  IOC 示例

  理解控制反轉最簡單的方式就是看它的實際應用。在對由三部分組成的 Spring 系列 的第1部分進行總結時,我使用了一個示例,演示瞭如何通過 Spring IOC 容器注入應用程序的依賴關係(而不是將它們構建進來)。

  我用開啓在線信用帳戶的用例作爲起點。對於該實現,開啓信用帳戶要求用戶與以下服務進行交互:

  信用級別評定服務,查詢用戶的信用歷史信息。

  遠程信息鏈接服務,插入客戶信息,將客戶信息與信用卡和銀行信息連接起來,以進行自動借記(如果需要的話)。

  電子郵件服務,向用戶發送有關信用卡狀態的電子郵件。

  三個接口

  對於這個示例,我假設服務已經存在,理想的情況是用鬆散耦合的方式把它們集成在一起。以下清單顯示了三個服務的應用程序接口。

  清單 3. CreditRatingInterface

Public interface CreditRatingInterface

 Public Boolean  getUserCreditHistoryInformation(ICustomer iCustomer);

  清單 3 所示的信用級別評定接口提供了信用歷史信息。它需要一個包含客戶信息的 Customer對象。該接口的實現是由CreditRating 類提供的。

  清單 4. CreditLinkingInterface

  public interface CreditLinkingInterface

  public String getUrl(); public void setUrl(String url);publicvoid linkCreditBankAccount() throws Exception ;

  信用鏈接接口將信用歷史信息與銀行信息(如果需要的話)連接在一起,並插入用戶的信用卡信息。信用鏈接接口是一個遠程服務,它的查詢是通過getUrl()方法進行的。URL Spring 框架的 bean 配置機制設置,我稍後會討論它。該接口的實現是由CreditLinking類提供的。

  清單 5. EmailInterface

  public interface EmailInterface

  public void sendEmail(ICustomer iCustomer); publicStringgetFromEmail(); public void setFromEmail(String fromEmail) ;publicString getPassword(); public void setPassword(Stringpassword) ;public String getSmtpHost() ; public voidsetSmtpHost(StringsmtpHost); public String getUserId() ; publicvoid setUserId(StringuserId);

 

 

Hibernate工作原理及爲什麼要用?

原理:

1.        
讀取並解析配置文件

2.        
讀取並解析映射信息,創建SessionFactory

3.        
打開Sesssion

4.        
創建事務Transation

5.        
持久化操作

6.        
提交事務

7.        
關閉Session

8.        
關閉SesstionFactory


爲什麼要用:


1.   
JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。

2.    Hibernate
是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

3.   hibernate
使用Java反射機制,而不是字節碼增強程序來實現透明性。

4.    hibernate
的性能非常好,因爲它是個輕量級框架。映射的靈活性很出色。它支持各種關係數據庫,從一對一到多對多的各種複雜關係。


2
Hibernate是如何延遲加載?

1.         Hibernate2
延遲加載實現:a)實體對象 b)集合(Collection


2.        
Hibernate3
提供了屬性的延遲加載功能

Hibernate在查詢數據的時候,數據並沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。

3
Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)

類與類之間的關係主要體現在表與表之間的關係進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-oneone-to-manymany-to-many

4
. 說下Hibernate的緩存機制


1.        
內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存


2.        
二級緩存:


a)        
應用及緩存


b)       
分佈式緩存


條件:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非關鍵數據

c)
第三方緩存的實現


5
Hibernate的查詢方式


Sql
Criteria,object comptosition

Hql


1
、 屬性查詢


2
、 參數查詢、命名參數查詢


3
、 關聯查詢


4
、 分頁查詢


5
、 統計函數


6
. 如何優化Hibernate

1.        
使用雙向一對多關聯,不使用單向一對多

2.        
靈活使用單向一對多關聯

3.        
不用一對一,用多對一取代

4.        
配置對象緩存,不使用集合緩存

5.        
一對多集合使用Bag,多對多集合使用Set

6.        
繼承類使用顯式多態

7.        
表字段要少,表關聯不要怕多,有二級緩存撐腰


7
Struts工作機制?爲什麼要使用Struts

工作機制:


Struts
的工作流程
:

web應用啓動時就會加載初始化
ActionServlet,ActionServlet

struts-config.xml
文件中讀取配置信息,把它們存放到各種配置對象


ActionServlet接收到一個客戶請求時,將執行如下流程
.

   
-(1)
檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息;

    -(2)
如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;

    -(3)
根據配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionFormvalidate()方法;

    -(4)
如果ActionFormvalidate()方法返回null或返回一個不包含ActionMessageActionErrors對象,就表示表單驗證成功;

    -(5)ActionServlet
根據ActionMapping所包含的映射信息決定將請求轉發給哪個Action,如果相應的Action實例不存在,就先創建這個實例,然後調用Actionexecute()方法;

   -(6)Action
execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發給ActionForward對象指向的JSP組件;
      
    -(7)ActionForward
對象指向JSP組件生成動態網頁,返回給客戶;

爲什麼要用:

JSP
ServletJavaBean技術的出現給我們構建了強大的企業應用系統提供可能。但用這些技術構建的系統非常的繁亂,所以在此之上,我們需要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。


基於Struts開發的應用由3類組件構成:
C控制器組件、M模型組件、V視圖組件

8
Strutsvalidate框架是如何驗證的?

struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。


9
. 說下Struts的設計模式


MVC
模式: web應用程序啓動時就會加載並初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創建,並被填入表單相應的數據,ActionServler根據Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionFormValidate()驗證後選擇將請求發送到哪個Action,如果Action不存在,ActionServlet會先創建這個對象,然後調用Actionexecute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態的網頁,返回給客戶。

單例模式

Factory(
工廠模式):

定義一個基類===》實現基類方法(子類通過不同的方法)===》定義一個工廠類(生成子類實例)

===
》開發人員調用基類方法


Proxy(
代理模式)

10 spring工作機制及爲什麼要用?


1.spring mvc
將所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模塊負責對請求進行真正的處理工作。

2.DispatcherServlet
查詢一個或多個HandlerMapping,找到處理請求的Controller.

3.DispatcherServlet
請求提交到目標Controller

4.Controller
進行業務邏輯處理後,會返回一個ModelAndView

5.
dispatcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象

6.
視圖對象負責渲染返回給客戶端。

爲什麼用:

{AOP
讓開發人員可以創建非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務   (比 如日誌、持久性、事務等)就可以分解成方面並應用到域對象上,同時不會增加域對象的對象模型的複雜性。


  IOC
允許創建一個可以構造對象的應用環境,然後向這些對象傳遞它們的協作對象。正如單詞 倒置 所表明的,IOC 就像反過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。


Spring
即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協作對象)。然後可以很容易地在需要時替換具有類似接口的協作對象。}

 

Spring的工作原理

一、 IoC(Inversion of control): 控制反轉
1
IOC
概念:控制權由對象本身轉向容器;由容器根據配置文件去創建實例並創建各個實例之間的依賴關係
核心:bean工廠;Spring中,bean工廠創建的各個實例稱作bean
二、AOP(Aspect-Oriented Programming): 面向方面編程
1 代理的兩種方式:
靜態代理:
 
針對每個具體類分別編寫代理類;
 
針對一個接口編寫一個代理類;
動態代理:
針對一個方面編寫一個InvocationHandler然後借用JDK反射包中的Proxy類爲各種接口動態生成相應的代理類
2
 AOP的主要原理:動態代理

Spring
工作原理
        Spring 
已經用過一段時間了,感覺Spring是個很不錯的框架。內部最核心的就是IOC了,
動態注入,讓一個對象的創建不用new了,可以自動的生產,這其實就是利用java裏的反射
反射其實就是在運行時動態的去創建、調用對象,Spring就是在運行時,跟xml  Spring的配置
文件來動態的創建對象,和調用對象裏的方法的 
     Spring
還有一個核心就是AOP這個就是面向切面編程,可以爲某一類對象 進行監督和控制(也就是
在調用這類對象的具體方法的前後去調用你指定的 模塊)從而達到對一個模塊擴充的功能。這些都是通過
配置類達到的。
   Spring
目的:就是讓對象與對象(模塊與模塊)之間的關係沒有通過代碼來關聯,都是通過配置類說明
管理的(Spring根據這些配置 內部通過反射去動態的組裝對象)
   
要記住:Spring是一個容器,凡是在容器裏的對象纔會有Spring所提供的這些服務和功能。
Spring
裏用的最經典的一個設計模式就是:模板方法模式。(這裏我都不介紹了,是一個很常用的設計模式)
  Spring
裏的配置是很多的,很難都記住,但是Spring裏的精華也無非就是以上的兩點,把以上兩點跟理解了
也就基本上掌握了Spring.

 



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