起源 你可能正在想“Spring不過是另外一個的framework”(英語釋義:框架,骨架;結構,構架)。當已經有許多開放
原始碼 (和專有)
J2EE framework時,我們為什麼還需要Spring Framework?
Spring是獨特的,因為若干個原因:
它定位的領域是許多其他流行的framework沒有的。Spring致力於提供一種方法管理你的
業務對象 。
Spring是全面的和模組化的。Spring有分層的體系結構,這意味著你能選擇使用它孤立的任何部分,它的架構仍然是內在穩定的。因此從你的學習中,你可得到最大的價值。例如,你可能選擇僅僅使用Spring來簡單化JDBC的使用,或用來管理所有的業務對象。
它的設計從底部幫助你編寫易於測試的代碼。Spring是用於測試驅動工程的理想的framework。
Spring對你的工程來說,它不需要一個以上的framework。Spring是潛在地一站式解決方案,定位於與典型套用相關的大部分基礎結構。它也涉及到其他framework沒有考慮到的內容。
背景 Rod Johnson 在2002年編著的《Expert one on one J2EE design and development》一書中,對Java EE 系統框架臃腫、低效、脫離現實的種種現狀提出了質疑,並積極尋求探索革新之道。以此書為指導思想,他編寫了interface21框架,這是一個力圖衝破J2EE傳統開發的困境,從實際需求出發,著眼於輕便、靈巧,易於開發、測試和部署的輕量級開發框架。Spring框架即以interface21框架為基礎,經過重新設計,並不斷豐富其內涵,於2004年3月24日,發布了1.0正式版。同年他又推出了一部堪稱經典的力作《Expert one-on-one J2EE Development without EJB》,該書在Java世界掀起了軒然大波,不斷改變著Java開發者程式設計和開發的思考方式。在該書中,作者根據自己多年豐富的實踐經驗,對
EJB 的各種笨重臃腫的結構進行了逐一的分析和否定,並分別以簡潔實用的方式替換之。至此一戰功成,Rod Johnson成為一個改變Java世界的大師級人物。
傳統J2EE套用的開發效率低,
套用伺服器 廠商對各種技術的支持並沒有真正統一,導致J2EE的套用沒有真正實現Write Once及Run Anywhere的承諾。Spring作為開源的中間件,獨立於各種套用伺服器,甚至無須套用伺服器的支持,也能提供套用伺服器的功能,如
聲明式事務 、事務處理等。
Spring致力於J2EE套用的各層的解決方案,而不是僅僅專注於某一層的方案。可以說Spring是企業套用開發的“一站式”選擇,並貫穿表現層、業務層及
持久層 。然而,Spring並不想取代那些已有的框架,而是與它們無縫地整合。
框架特徵 輕量 ——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR檔案里發布。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring套用中的對象不依賴於Spring的特定類。
控制反轉 ——Spring通過一種稱作控制反轉(
IoC )的技術促進了低耦合。當套用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你可以認為IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
面向切面 ——Spring提供了
面向切面編程 的豐富支持,允許通過分離套用的業務邏輯與系統級服務(例如審計(auditing)和
事務 (
transaction )管理)進行
內聚性 的開發。
套用對象 只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。
容器 ——Spring包含並管理套用對象的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創建——基於一個可配置原型(
prototype ),你的bean可以創建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。
框架 ——Spring可以將簡單的
組件 配置、組合成為複雜的套用。在Spring中,
套用對象 被聲明式地組合,典型地是在一個XML檔案里。Spring也提供了很多基礎功能(
事務管理 、持久化框架集成等等),將套用邏輯的開發留給了你。
MVC ——Spring的作用是整合,但不僅僅限於整合,Spring 框架可以被看做是一個企業解決方案級別的框架。客戶端傳送請求,伺服器控制器(由DispatcherServlet實現的)完成請求的轉發,控制器調用一個用於映射的類HandlerMapping,該類用於將請求映射到對應的處理器來處理請求。HandlerMapping 將請求映射到對應的處理器Controller(相當於Action)在Spring 當中如果寫一些處理器組件,一般實現Controller 接口,在Controller 中就可以調用一些Service 或DAO 來進行數據操作 ModelAndView 用於存放從DAO 中取出的數據,還可以存放回響視圖的一些數據。 如果想將處理結果返回給用戶,那么在Spring 框架中還提供一個視圖組件ViewResolver,該組件根據Controller 返回的標示,找到對應的視圖,將回響response 返回給用戶。
所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的代碼。它們也為Spring中的各種模組提供了基礎支持。
特性 強大的基於
JavaBeans 的採用控制反轉(Inversion of Control,IoC)原則的配置管理,使得應用程式的組件更加快捷簡易。
一個可用於從 applet 到 Java EE 等不同運行環境的核心 Bean 工廠。
資料庫事務的一般化抽象層,允許宣告式(Declarative)事務管理器,簡化事務的劃分使之與底層無關。
內建的針對 JTA 和 單個 JDBC 數據源的一般化策略,使 Spring 的事務支持不要求 Java EE 環境,這與一般的 JTA 或者 EJB CMT 相反。
JDBC 抽象層提供了有針對性的異常等級(不再從SQL異常中提取原始代碼), 簡化了錯誤處理, 大大減少了程式設計師的編碼量. 再次利用JDBC時,你無需再寫出另一個 '終止' (finally) 模組. 並且面向JDBC的異常與Spring 通用
數據訪問對象 (Data Access Object) 異常等級相一致.
以資源容器,DAO 實現和事務策略等形式與 Hibernate,JDO 和 iBATIS SQL Maps 集成。利用眾多的反轉控制方便特性來全面支持, 解決了許多典型的Hibernate集成問題. 所有這些全部遵從Spring通用事務處理和通用數據訪問對象異常等級規範.
靈活的基於核心 Spring 功能的 MVC 網頁應用程式框架。開發者通過策略接口將擁有對該框架的高度控制,因而該框架將適應於多種呈現(View)技術,例如 JSP,FreeMarker,Velocity,Tiles,iText 以及 POI。值得注意的是,Spring 中間層可以輕易地結合於任何基於 MVC 框架的網頁層,例如 Struts,WebWork,或 Tapestry。
提供諸如事務管理等服務的面向切面編程(AOP)框架。
特點 1.方便解耦,簡化開發
通過Spring提供的IoC容器,我們可以將對象之間的依賴關係交由Spring進行控制,避免硬編碼所造成的過度程式耦合。有了Spring,用戶不必再為單實例模式類、屬性檔案解析等這些很底層的需求編寫代碼,可以更專注於上層的套用。
通過Spring提供的
AOP 功能,方便進行面向切面的編程,許多不容易用傳統OOP實現的功能可以通過AOP輕鬆應付。
在Spring中,我們可以從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活地進行事務的管理,提高開發效率和質量。
4.方便程式的測試
可以用非容器依賴的編程方式進行幾乎所有的測試工作,在Spring里,測試不再是昂貴的操作,而是隨手可做的事情。例如:Spring對Junit4支持,可以通過註解方便的測試Spring程式。
5.方便集成各種優秀框架
Spring不排斥各種優秀的開源框架,相反,Spring可以降低各種框架的使用難度,Spring提供了對各種優秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.降低Java EE API的使用難度
Spring對很多難用的Java EE API(如JDBC,JavaMail,遠程調用等)提供了一個薄薄的封裝層,通過Spring的簡易封裝,這些Java EE API的使用難度大為降低。
7.Java 源碼是經典學習範例
Spring的源碼設計精妙、結構清晰、匠心獨運,處處體現著大師對
Java設計模式 靈活運用以及對Java技術的高深造詣。Spring框架源碼無疑是Java技術的最佳實踐範例。如果想在短時間內迅速提高自己的Java技術水平和套用開發水平,學習和研究Spring源碼將會使你收到意想不到的效果。
好處 在我們進入細節以前,讓我們看一下Spring可以給一個工程帶來的一些好處:
Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有API的framework,你會發現Spring關注了遺留下的問題。Spring能消除在許多工程上對Singleton的過多使用。根據我的經驗,這是一個主要的問題,它減少了系統的
可測試性 和
面向對象 特性。
Spring能消除使用各種各樣格式的屬性定製檔案的需要,在整個套用和工程中,可通過一種一致的方法來進行配置。曾經我們可能對類是否有某個屬性會感到迷惑,因此我們不得不去看它的javadoc或源碼。自從有了Spring,你可很簡單地看到類的JavaBean屬性。反轉控制的使用(在下面討論)幫助完成這種簡化。
Spring能通過接口而不是類促進好的編程習慣,減少編程代價到幾乎為零。
Spring被設計為讓使用它創建的套用儘可能少的依賴於他的APIs。在Spring套用中的大多數
業務對象 沒有依賴於Spring。
Spring能使EJB的使用成為一個實現選擇,而不是套用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務接口,卻不會影響調用代碼。
Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適於許多web套用。例如,Spring能使用AOP提供聲明性
事務 而不通過使用EJB容器,如果你僅僅需要與單個的資料庫打交道,甚至不需要JTA實現。
Spring為數據存取提供了一致的框架,不論是使用JDBC或O/R mapping產品(如Hibernate)。
Spring確實使你能通過最簡單可行的解決辦法解決你的問題。這些特性是有很大價值的。
總結起來,Spring有如下優點:
1.低侵入式設計,代碼污染極低
2.獨立於各種
套用伺服器 ,基於Spring框架的套用,可以真正實現Write Once,Run Anywhere的承諾
3.Spring的DI機制降低了
業務對象 替換的複雜性,提高了組件之間的解耦
4.Spring的AOP支持允許將一些通用任務如安全、事務、日誌等進行集中式管理,從而提供了更好的復用
5.Spring的ORM和DAO提供了與第三方持久層框架的良好整合,並簡化了底層的資料庫訪問
6.Spring並不強制套用完全依賴於Spring,開發者可自由選用Spring框架的部分或全部
作用 Spring提供許多功能,在此我將快速地依次展示其各個主要方面。
spring
首先,讓我們明確Spring範圍。儘管Spring覆蓋了許多方面,但我們已經有清楚的概念,它什麼應該涉及和什麼不應該涉及。
Spring的主要目的是使JavaEE易用和促進好編程習慣。
Spring不重新開發已有的東西。因此,在Spring中你將發現沒有日誌記錄的包,沒有
連線池 ,沒有分布事務調度。這些均有
開源項目 提供(例如Commons Logging 用來做所有的日誌輸出,或Commons DBCP用來作數據連線池),或由你的應用程式
伺服器 提供。因為同樣的的原因,我們沒有提供O/R mapping層,對此,已有友好的解決辦法如Hibernate和JDO。
Spring的目標是使已存在的技術更加易用 。
例如,儘管我們沒有底層
事務 協調處理,但我們提供了一個抽象層覆蓋了JTA或任何其他的事務策略。
Spring沒有直接和其他的開源項目競爭,除非我們感到我們能提供新的一些東西。例如,像許多開發人員,我們從來沒有為Struts高興過,並且感到在MVC web framework中還有改進的餘地。在某些領域,例如輕量級的IoC容器和AOP框架,Spring有直接的競爭,但是在這些領域還沒有已經較為流行的解決方案。(Spring在這些區域是開路先鋒。)
Spring也得益於內在的一致性。
所有的開發者都在唱同樣的的讚歌,基礎想法依然是Expert One-on-One J2EE設計與開發的那些。
並且我們已經能夠使用一些主要的概念,例如倒置控制,來處理多個領域。
當然保證可移植性總是一次挑戰,但是我們避免任何特定平台或非標準化,並且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的套用伺服器上的用戶。
基本框架 Spring 框架是一個分層架構,由 7 個定義良好的模組組成。Spring模組構建在核心容器之上,核心容器定義了創建、配置和管理 bean 的方式,如圖所示:
Spring 組成Spring框架的每個模組(或組件)都可以單獨存在,或者與其他一個或多個模組聯合實現。每個模組的功能如下:1、核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要組件是 BeanFactory,它是
工廠模式 的實現。BeanFactory 使用
控制反轉 (IOC) 模式將應用程式的配置和依賴性規範與實際的應用程式代碼分開。
2、Spring 上下文:Spring 上下文是一個
配置檔案 ,向 Spring框架提供上下文信息。Spring 上下文包括企業服務,例如
JNDI 、EJB、電子郵件、國際化、校驗和調度功能。
3、Spring AOP:通過配置管理特性,Spring AOP 模組直接將面向切面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持
AOP 。Spring AOP 模組為基於 Spring 的應用程式中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程式中。
4、Spring DAO:JDBC
DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理
異常處理 和不同資料庫供應商拋出的錯誤訊息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連線)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
5、Spring ORM:Spring 框架插入了若干個
ORM 框架,從而提供了 ORM 的對象關係工具,其中包括
JDO 、
Hibernate 和
iBatis SQL Map。所有這些都遵從 Spring 的通用
事務 和 DAO 異常層次結構。
6、Spring Web 模組:Web 上下文模組建立在應用程式上下文模組之上,為基於 Web 的應用程式提供了上下文。所以,Spring框架支持與 Jakarta Struts 的集成。Web 模組還簡化了處理多部分請求以及將請求參數綁定到
域對象 的工作。
7、Spring MVC 框架:
MVC 框架是一個全功能的構建 Web應用程式的 MVC 實現。通過策略接口,MVC框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、
Velocity 、
Tiles 、iText 和 POI。模型由javabean構成,存放於Map;視圖是一個接口,負責顯示模型;控制器表示邏輯代碼,是Controller的實現。Spring框架的功能可以用在任何
J2EE 伺服器 中,大多數功能也適用於不受管理的環境。Spring 的核心要點是:支持不綁定到特定 J2EE服務的可重用業務和
數據訪問對象 。毫無疑問,這樣的對象可以在不同J2EE 環境(Web 或EJB)、獨立應用程式、
測試環境 之間重用。
下載安裝 下載和安裝Spring請按如下步驟進行。
(1)登錄站點,下載Spring的最新穩定版本。最新版本為spring-framework-5.0.建議下載spring-framework-spring-framework-4.0.0.M2-dist 這個壓縮檔不僅包含Spring的開發包,而且包含Spring編譯和運行所依賴的第三方類庫。
解壓縮 下載到的壓縮檔,解壓縮後的資料夾套用如下幾個資料夾。
dist :該資料夾下放Spring的jar包,通常只需要Spring.jar檔案即可。該資料夾下還有一些類似spring-Xxx.jar的壓縮檔, 這些壓縮檔是spring.jar壓縮檔的子模組壓縮檔。除非確定整個J2EE套用只需要使用Spring的某一方面時,才考慮使用這種分模組壓縮檔。通常建議使用Spring.jar
docs :該資料夾下包含spring的相關文檔、開發指南及API參考文檔。
lib :該資料夾下包含spring編譯和運行所依賴的第三方類庫,該路徑下的類庫並不是spring必需的,但如果需要使用第三方類庫的支持,這裡的類庫就是必需要的。
samples :該資料夾下包含Spring的幾個簡單例子,可作為Spring入門學習的案例。
src :該資料夾下包含Spring的全部源檔案,如果開發過程中有地方無法把握,可以參考該源檔案,了解底層實現。
test :該資料夾下包含Spring的測試示例。
spring tiger :該路徑下存放關於JDK的相關內容
解壓縮 後的資料夾下,還包含一些關於Spring的License和項目相關檔案
(2)將spring.jar複製到項目的CLASSPATH路徑下,對於Web套用,將spring.jar檔案複製到WEB-INF/lib路徑下,該套用即可以利用Spring框架了。
(3)通常Spring的框架還依賴於其他一些jar檔案,因此還須將lib下對應的包複製到WEB-INF/lib路徑下,具體要複製哪些jar檔案,取決於套用所需要使用的項目。通常需要複製
cglib ,dom4j,jakarta-commons,log4j等資料夾下的jar檔案。
(4)為了編譯java檔案,可以找到Spring的基礎類,將Spring.jar檔案的路徑添加到
環境變數 CLASSPATH中。當然,也可以使用ANT工具,但無須添加環境變數。如果使用Eclipse或者NetBeans等IDE時,也不需要設定環境變數。
Spring MVC
傳統的web架構的view 表現層使用struts作為表現層。但是如果試用下spring自帶的MVC,會發現spring 在一般場合完全可以取代struts。從某些角度來說,spring的
mvc 設計的更加合理,有興趣的話不妨嘗試下單個的spring的MVC。
套用實例 新建一個登入頁面:loginActionSupport.jsp,代碼如下
<%@page contentType="text/html;charset=GBK" isELIgnored="false"%><html><head><title>;實現用戶登錄實例,struts和Spring整合</title></head><body><font size=’22’> $<br> </font><form name="form1" action="/myLogin/loginActionSupportdo" method="post">用戶名:<input type="text" name="username" value="${user.username}"/><br>密碼:<input type="password" name="password" value="${user.password}"/><br><input type="submit" name=”method” value="提交"/></form></body></html> 2.創建一個存儲登入用戶信息的類:User.java該類繼承於ActionF
orm ,代碼如下:
package com.zhaosoft.bean;import org.apache.struts.action.ActionForm;public class User extends ActionForm{private String username=null;private String password=null;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}} spring 3.Com.zhaosoft.action中新建一個LoginActionSupport.java,該類不繼承於struts的Action,而是繼承於Spring的ActionSupport,代碼示例如下:
package com.zhaosoft.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.springframework.context.ApplicationContext;import org.springframework.web.struts.ActionSupport;import com.zhaosoft.bean.User;import com.zhaosoft.domain.Login;public class LoginActionSupport extends ActionSupport {public ActionForward execute(ActionMapping mapping,ActionFormform,HttpServletRequest request,HttpServletResponse response)throws Exception {// 通過ApplicationContext獲取配置檔案ApplicationContext ctx = getWebApplicationContext();Login login = (Login) ctx.getBean("login");login.login((User) form);request.setAttribute("msg",login.getMsg());request.setAttribute("user",(User) form);return mapping.findForward("login");}}
spring 主要產品 Spring Framework
Spring Web Flow
Spring Web Services
Spring Security (Acegi Security)
Spring Dynamic Modules For OSGi(tm) Service Platforms
Spring Batch
Spring Integration
Spring LDAP* Spring IDE
spring Spring Modules
Spring JavaConfig
Spring Rich Client
Spring .NET
Spring BeanDoc
Spring .NET
Spring 並不是Java所特有的,它也套用於.NET平台。而且得到了很好的發展!
Spring DOTNET 是一個關注於.NET企業套用開發的應用程式框架。它能夠提供寬廣範圍的功能,例如依賴注入、
面向切面編程 (AOP)、數據訪問抽象,以及ASP DOTNET集成等。基於java的spring框架的核心概念和價值已被套用到.NET。Spring DOTNET 1.0 包含一個完全功能的依賴注入容器和AOP庫。後續的發布將包含對ASP DOTNET、Remoting和數據訪問的支持。
步驟 Spring確實使你能通過最簡單可行的解決辦法來解決你的問題。而這是有有很大價值的。同時他的
原始碼 的設計理念也受到很多程式設計師的追捧,簡潔,易用.可是從哪著手研究Spring卻是很多新手頭疼的地方,下面的參考資料將帶領大家慢慢的深入解析Spring
1 Spring中的事務處理
spring 2 IoC容器在Web容器中的啟動
3 Spring JDBC
4 Spring MVC
5 Spring AOP獲取Proxy
6 Spring聲明式事務處理
7 Spring AOP中對攔截器調用的實現
8 Spring驅動Hibernate的實現
9 Spring Acegi框架鑒權的實現
IOC和AOP
控制反轉 模式(也稱作依賴性注入)的基本概念是:不創建對象,但是描述創建它們的方式。在代碼中不直接與對象和服務連線,但在
配置檔案 中描述哪一個組件需要哪一項服務。容器 (在 Spring 框架中是 IOC 容器) 負責將這些聯繫在一起。在典型的 IOC 場景中,容器創建了所有對象,並設定必要的屬性將它們連線在一起,決定什麼時間調用方法。下表列出了 IOC 的一個實現模式。
類型 1
服務需要實現專門的接口,通過接口,由對象提供這些服務,可以從對象查詢
依賴性 (例如,需要的附加服務)【接口注入】。
類型 2
通過
JavaBean 的屬性(例如 setter 方法)分配依賴性【setter方法注入】。
類型 3
依賴性以
構造函式 的形式提供,不以 JavaBean 屬性的形式公開【構造器注入】。
Spring 框架的 IOC 容器採用類型 2 和類型3 實現。
面向切面的編程,即 AOP,是一種編程技術,它允許程式設計師對橫切關注點或橫切典型的職責分界線的行為(例如日誌和事務管理)進行模組化。AOP 的核心構造是方面,它將那些影響多個類的行為封裝到可重用的模組中。
AOP 和 IOC 是補充性的技術,它們都運用模組化方式解決企業
應用程式開發 中的複雜問題。在典型的
面向對象 開發方式中,可能要將日誌記錄語句放在所有方法和 Java 類中才能實現日誌功能。在 AOP 方式中,可以反過來將日誌服務模組化,並以聲明的方式將它們套用到需要日誌的
組件 上。當然,優勢就是 Java 類不需要知道日誌服務的存在,也不需要考慮相關的代碼。所以,用 Spring AOP 編寫的應用程式代碼是鬆散耦合的。
AOP 的功能完全集成到了 Spring
事務管理 、日誌和其他各種特性的上下文中。
AOP 編程方面, Spring 提供了很多特性,例如 PointCut, Advice, Advisor, 粗略來說就是事務管理、日誌和其他各種特性 的切入地點。
容器 Spring 設計的核心是 org.springframework.beans 包,它的設計目標是與 JavaBean 組件一起使用。這個包通常不是由用戶直接使用,而是由
伺服器 將其用作其他多數功能的底層中介。下一個最高級抽象是BeanFactory接口,它是工廠設計模式的實現,允許通過名稱創建和檢索對象。BeanFactory 也可以管理對象之間的關係。
BeanFactory 支持兩個對象模型。
1、
單態 模型提供了具有特定名稱的對象的共享實例,可以在查詢時對其進行檢索。Singleton是默認的也是最常用的對象模型。對於無狀態服務對象很理想。
2、原型模型確保每次檢索都會創建單獨的對象。在每個用戶都需要自己的對象時,
原型模型 最適合。
bean 工廠的概念是 Spring 作為 IOC 容器的基礎。IOC 將處理事情的責任從應用程式代碼轉移到框架。