官方文檔地址:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#spring-introduction
作者列表
Rod Johnson , Juergen Hoeller , Keith Donald , Colin Sampaleanu , Rob Harrop , Thomas Risberg , Alef Arendsen , Darren Davison , Dmitriy Kopylenko , Mark Pollack , Thierry Templier , Erwin Vervaet , Portia Tung , Ben Hale , Adrian Colyer , John Lewis , Costin Leau , Mark Fisher , Sam Brannen , Ramnivas Laddad , Arjen Poutsma , Chris Beams , Tareq Abedrabbo , Andy Clement , Dave Syer , Oliver Gierke , Rossen Stoyanchev , Phillip Webb , Rob Winch , Brian Clozel , Stephane Nicoll , Sebastien Deleuze
4.3.8.RELEASE
版權(quán)所有? 2004-2016
Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.
只要您不對(duì)這些副本收取任何費(fèi)用,并且進(jìn)一步規(guī)定,每個(gè)副本都包含本版權(quán)聲明,無(wú)論是以印刷版還是電子版分發(fā),本文檔的副本可供您自己使用并分發(fā)給他人。
第一部分 Spring框架概述
Spring Framework是一個(gè)輕量級(jí)解決方案,可以一站式的構(gòu)建企業(yè)級(jí)應(yīng)用程序。但是,Spring是模塊化的,允許使用部分所需的部件,而不使用其余的部件。可以在任何Web框架上使用控制反轉(zhuǎn)(IoC),也可以僅僅是用 Hibernate集成代碼或者JDBC抽象層。Spring框架支持聲明式事務(wù)管理,通過RMI或Web服務(wù)遠(yuǎn)程訪問您的邏輯,以及用于持久存儲(chǔ)數(shù)據(jù)的各種選項(xiàng)。它提供了一個(gè)全功能的MVC框架,使您能夠?qū)OP透明地集成到您的軟件中。
Spring被設(shè)計(jì)為非侵入性的,這意味著您的域邏輯代碼通常不依賴于框架本身。在集成層(如數(shù)據(jù)訪問層)中,會(huì)存在一些依賴同時(shí)依賴于數(shù)據(jù)訪問技術(shù)和Spring,但是這些依賴可以很容易地從代碼庫(kù)中分離出來(lái)。
本文檔是Spring Framework功能的參考指南。如果您對(duì)本文檔有任何要求,意見或問題,請(qǐng)將其發(fā)布在 用戶郵件列表中?;蛘咴赟tackOverflow上詢問框架本身的問題(請(qǐng)參閱https://spring.io/questions)。
1. Spring入門
本參考指南提供有關(guān)Spring框架的詳細(xì)信息。它為所有功能提供了全面的文檔,以及Spring所提供的基本概念(如“依賴注入”)的背景知識(shí)。
如果您剛開始使用Spring,可以通過創(chuàng)建一個(gè) Spring Boot的基本應(yīng)用程序來(lái)開始使用Spring框架。Spring Boot提供了一種快速(有選擇的)的方式創(chuàng)建一個(gè)基于生產(chǎn)的Spring應(yīng)用程序。它基于Spring框架,有利于配置的設(shè)定,從而使得程序盡快開始運(yùn)行。
您可以使用start.spring.io生成一個(gè)基本項(xiàng)目,或按照“入門指南”中的一個(gè)指南,例如開始創(chuàng)建RESTful 項(xiàng)目入門 。除了易于理解以外,這些指南非常任務(wù)化,大部分都是基于Spring Boot。他們還涵蓋了Spring解決方案中您可能想要考慮的其他項(xiàng)目。
2. Spring框架介紹
Spring 框架是一個(gè)Java平臺(tái),為開發(fā)Java應(yīng)用程序提供全面的基礎(chǔ)設(shè)施支持。Spring很好的處理了基礎(chǔ)設(shè)施,因此可以專注于應(yīng)用程序開發(fā)。
Spring使您能夠從“簡(jiǎn)單的Java對(duì)象”(POJO)構(gòu)建應(yīng)用程序,并將企業(yè)服務(wù)非侵入式應(yīng)用于POJO。此功能適用于Java SE編程模型以及完整和部分的Java EE。
那么作為應(yīng)用程序開發(fā)人員,我們可以從Spring平臺(tái)中得到什么呢:
- 使Java方法在數(shù)據(jù)庫(kù)事務(wù)中執(zhí)行,而不必處理事務(wù)API。
- 使本地Java方法成為HTTP端點(diǎn),而無(wú)需處理Servlet API。
- 使本地Java方法成為消息處理程序,而無(wú)需處理JMS API。
- 使本地Java方法成為管理操作,而無(wú)需處理JMX API。
2.1依賴注入和控制反轉(zhuǎn)
一個(gè)Java應(yīng)用程序,從受限制的嵌入式應(yīng)用到n層的服務(wù)端應(yīng)用,典型地是由相互合作的對(duì)象組成的,因此,一個(gè)應(yīng)用程序中的對(duì)象是相互依賴的。
雖然Java平臺(tái)提供了豐富的應(yīng)用程序開發(fā)功能,但它缺乏將基本構(gòu)建塊組織成一個(gè)連貫的整體的方法,將該任務(wù)留給架構(gòu)師和開發(fā)人員。可以使用工廠模式Factory,抽象工廠模式Abstract Factory,創(chuàng)建者模式Builder,裝飾者模式Decorator和服務(wù)定位器模式Service Locator等設(shè)計(jì)模式來(lái)構(gòu)成構(gòu)成應(yīng)用程序的各種類和對(duì)象實(shí)例,這些模式是簡(jiǎn)單的:因?yàn)榭蚣芙o出這些設(shè)計(jì)模式名稱對(duì)應(yīng)的最佳實(shí)踐,以及什么樣的模式,應(yīng)用于哪里,它解決的問題等等。這些設(shè)計(jì)模式都是最佳實(shí)踐的結(jié)晶,所以你應(yīng)該在你的應(yīng)用程序中使用它們。
Spring的控制反轉(zhuǎn)解決了上述問題,它提供了一種正式的解決方案,你可以把不相干組件組合在一起,從而組成一個(gè)完整的可以使用的應(yīng)用。Spring根據(jù)設(shè)計(jì)模式編碼出了非常優(yōu)秀的代碼,所以可以直接集成到自己的應(yīng)用中。因此,大量的組織機(jī)構(gòu)都使用Spring來(lái)保證應(yīng)用程序的健壯性和可維護(hù)性。
**背景**
Martin Fowler 在2004年在他的網(wǎng)站上提出了關(guān)于控制反轉(zhuǎn)(IoC)的問題“The question is, what aspect of control are [they] inverting?”。
Fowler 由此建議重新命名這個(gè)原則,使其更加清晰明了,并提出依賴注入。
2.2框架模塊
Spring框架由組織成約20個(gè)模塊的功能組成。這些模塊分為核心容器Core Container,數(shù)據(jù)訪問/集成Data Access / Integration,Web,AOP(面向?qū)ο缶幊蹋?code>Instrumentation,消息處理Messaging和測(cè)試Test,如下圖所示。

以下部分列出了每個(gè)功能對(duì)應(yīng)的模塊及主題,并且提供功能的Artifact name。Artifact name與依賴關(guān)系管理工具中使用的Artifact name相關(guān)聯(lián)。
2.2.1核心集裝箱Core Container
核心容器spring-core, spring-beans,spring-context,spring-context-support,和spring-expression(Spring表達(dá)式語(yǔ)言)多個(gè)模塊組成。
spring-core和spring-beans模塊是Spring框架的基礎(chǔ),包括IoC控制反轉(zhuǎn)和依賴注入。而BeanFactory是工廠模式的復(fù)雜實(shí)現(xiàn)。它消除了對(duì)編程單例的需要,并允許將依賴關(guān)系的配置和規(guī)范與實(shí)際程序邏輯分離。
Spring上下文模塊spring-context建立在Spring核心Core和Bean模塊之上:它以一個(gè)JNDI注冊(cè)的方式去訪問一個(gè)對(duì)象。上下文模塊Context繼承自Beans模塊,并增加了對(duì)國(guó)際化的支持(例如使用資源束),事件傳播,資源加載以及透明創(chuàng)建上下文對(duì)象,例如Servlet容器。Context模塊還支持Java EE功能,如EJB,JMX(Java Management Extensions,即Java管理擴(kuò)展)和基本遠(yuǎn)程處理。ApplicationContext接口是上下文模塊的關(guān)鍵點(diǎn)。spring-context-support支持將常見的第三方庫(kù)集成到Spring應(yīng)用程序上下文緩存(EhCache,Guava,JCache),郵件(JavaMail),調(diào)度(CommonJ,Quartz)和模版引擎(FreeMarker,JasperReports,Velocity)中
spring-expression模塊提供了強(qiáng)大的表達(dá)式語(yǔ)言,用于在運(yùn)行時(shí)查詢和操作對(duì)象圖。它是JSP 2.1規(guī)范中規(guī)定的統(tǒng)一表達(dá)語(yǔ)言(統(tǒng)一EL)的擴(kuò)展。該語(yǔ)言支持設(shè)置和獲取屬性值,屬性分配,方法調(diào)用,訪問數(shù)組,集合和索引器的內(nèi)容,邏輯和算術(shù)運(yùn)算符,命名變量以及從Spring的IoC容器中以名稱檢索對(duì)象。它還支持列表投影和選擇以及常見列表聚合。
2.2.2 AOP和檢測(cè)Instrumentation
spring-aop模塊提供了一個(gè)符合AOP聯(lián)盟標(biāo)準(zhǔn)的面向?qū)ο蟮木幊虒?shí)現(xiàn),允許您定義方法攔截器和切入點(diǎn),用于分離實(shí)現(xiàn)可分離的功能代碼。使用源級(jí)別元數(shù)據(jù)功能,您還可以以類似于.NET屬性的方式將行為信息合并到代碼中。
獨(dú)立的spring-aspects模塊提供與AspectJ(一個(gè)面向切面的框架)的集成。
spring-instrument模塊提供了對(duì)檢測(cè)類的支持和用于特定的應(yīng)用服務(wù)器的類加載器的實(shí)現(xiàn)。spring-instrument-tomcat模塊包含用與Tomcat的Spring測(cè)試代理。
2.2.3消息傳遞
Spring 4包含的spring-messaging是從Spring集成項(xiàng)目中抽象出來(lái)的模塊,例如Message、MessageChannel、MessageHandler,和其他基于消息的基礎(chǔ)應(yīng)用程序。該模塊還包括一組用于將消息映射到方法的注釋,類似于基于Spring MVC注釋的編程模型。
2.2.4數(shù)據(jù)訪問/集成
數(shù)據(jù)訪問/集成層由JDBC,ORM,OXM,JMS和事務(wù)模塊組成。
spring-jdbc模塊提供了一個(gè)JDBC抽象層,可以省去冗長(zhǎng)的JDBC編碼和解析數(shù)據(jù)庫(kù)供應(yīng)商特定錯(cuò)誤代碼的需要。
spring-tx模塊支持編程式事務(wù)和聲明式事務(wù),可用于實(shí)現(xiàn)了特定接口的類和所有的POJO對(duì)象。
(譯者注:編程式事務(wù)需要自己寫beginTransaction()、commit()、rollback()等事務(wù)管理方法,聲明式事務(wù)是通過注解或配置由spring自動(dòng)處理,編程式事務(wù)粒度更細(xì))
spring-orm模塊為流行的對(duì)象關(guān)系映射API提供集成層 ,包括JPA, JDO和Hibernate。使用spring-orm模塊,您可以將所有這些O/RMapping框架與Spring提供的所有其他功能結(jié)合使用,例如前面提到的簡(jiǎn)單的聲明式事務(wù)管理功能。
spring-oxm模塊提供了一個(gè)支持Object/XML映射實(shí)現(xiàn)(如JAXB,Castor,XMLBeans,JiBX和XStream)的抽象層。
spring-jms模塊(Java消息服務(wù))包含用于生成和消費(fèi)消息的功能。自Spring Framework 4.1以來(lái),它提供了與spring-messaging模塊的集成。
2.2.5 網(wǎng)絡(luò)Web
網(wǎng)絡(luò)層由spring-web,spring-webmvc,spring-websocket,和 spring-webmvc-portlet模塊組成。
spring-web模塊提供基本的面向Web的集成功能,例如多部分multipart文件上傳功能,使用Servlet監(jiān)聽器初始化IoC容器等。它還包含一個(gè)HTTP客戶端和Spring的遠(yuǎn)程支持的Web相關(guān)部分。
spring-webmvc模塊(也稱為Web-Servlet模塊)包含用于Web應(yīng)用程序的Spring的模型視圖控制器model-view-controller(MVC)和REST Web Services實(shí)現(xiàn)。Spring MVC架構(gòu)提供了領(lǐng)域模型代碼和Web表單之間的分離,并與Spring框架的其他所有功能集成。
spring-webmvc-portlet模塊(也稱為Web-Portlet模塊)提供了在Portlet環(huán)境中使用的MVC實(shí)現(xiàn),并反映了基于Servlet的spring-webmvc模塊的功能。
2.2.6測(cè)試
spring-test模塊支持使用JUnit或TestNG對(duì)Spring組件進(jìn)行單元測(cè)試和集成測(cè)試。它提供一致性加載和Spring應(yīng)用程序上下文ApplicationContext,以及緩存這些上下文。它還提供可用于獨(dú)立測(cè)試代碼的模擬對(duì)象的功能。
2.3使用場(chǎng)景
之前描述的構(gòu)建塊使Spring成為許多場(chǎng)景中的邏輯選擇,不管是在資源受限設(shè)備上運(yùn)行的嵌入式應(yīng)用程序,或者使用Spring的事務(wù)管理功能和Web框架集成的企業(yè)級(jí)應(yīng)用程序。

Spring的聲明式事務(wù)管理功能使Web應(yīng)用程序完全事務(wù)性,就像使用EJB容器管理的事務(wù)一樣。所有您的定制業(yè)務(wù)邏輯都可以使用簡(jiǎn)單的POJO實(shí)現(xiàn),并由Spring的IoC容器進(jìn)行管理。附加服務(wù)包括支持發(fā)送電子郵件和獨(dú)立于Web層的驗(yàn)證,可讓您選擇執(zhí)行驗(yàn)證規(guī)則的位置。Spring的ORM支持與JPA,Hibernate和JDO集成; 例如,當(dāng)使用Hibernate時(shí),您可以繼續(xù)使用現(xiàn)有的映射文件和標(biāo)準(zhǔn)的Hibernate SessionFactory配置。表單控制器將Web層與域模型無(wú)縫集成,移除了將ActionFormsHTTP參數(shù)轉(zhuǎn)換為域模型的值或其他類的需求。

有時(shí)情況不允許你完全切換到不同的框架。Spring框架不會(huì)強(qiáng)制使用其內(nèi)的所有模塊; 這不是一個(gè)要么全有,要么全沒有的解決方案。使用Struts,Tapestry,JSF或其他UI框架構(gòu)建的現(xiàn)有前端可以與基于Spring的中間層集成,從而允許您使用Spring事務(wù)功能。您只需使用一個(gè)應(yīng)用程序上下文對(duì)象ApplicationContext連接您的業(yè)務(wù)邏輯,并使用WebApplicationContext來(lái)集成Web層。

當(dāng)你需要通過Web服務(wù)來(lái)訪問現(xiàn)有的代碼,你可以使用Spring框架的的Hessian-,Burlap-,Rmi-或JaxRpcProxyFactory類。啟用對(duì)現(xiàn)有應(yīng)用程序的遠(yuǎn)程訪問并不困難。

Spring框架還為Enterprise JavaBeans提供了一個(gè)訪問抽象層,使您能夠重用現(xiàn)有的POJO,并將其包裝在無(wú)狀態(tài)會(huì)話bean中,以用于可能需要聲明式安全性的可擴(kuò)展的,故障安全的Web應(yīng)用程序。
2.3.1依賴管理和命名約定
依賴關(guān)系管理和依賴注入是不同的。為了將Spring的這些不錯(cuò)的功能引入到應(yīng)用程序中(如依賴注入),您需要組裝所有需要的庫(kù)(jar文件),并在運(yùn)行時(shí)和編譯時(shí)將它們導(dǎo)入到類路徑中。這些依賴關(guān)系不是注入的虛擬組件,而是文件系統(tǒng)中的物理資源(通常情況下如此)。依賴關(guān)系管理的過程包括定位這些資源,存儲(chǔ)它們并將其添加到類路徑中。依賴關(guān)系可以是直接的(例如,我的應(yīng)用程序在運(yùn)行時(shí)依賴Spring)或間接(例如我的應(yīng)用程序取決于commons-dbcp哪個(gè)依賴于commons-pool)。間接依賴關(guān)系也被稱為“傳遞性”,它們是最難識(shí)別和管理的依賴關(guān)系。
如果你要使用Spring框架,你需要獲得一個(gè)包含你所需要的Spring塊的jar庫(kù)的副本。為了使獲取更容易,Spring框架被打包為一組盡可能分離依賴關(guān)系的模塊,例如,如果您不想編寫Web應(yīng)用程序,則不需要spring-web模塊。本指南中,我們使用速記命名約定到Spring庫(kù)模塊spring-*或 spring-*.jar,其中*代表該模塊的短名稱(例如spring-core, spring-webmvc, spring-jms等)。您使用的實(shí)際jar文件名通常是用模塊名稱與版本號(hào)連接(例如spring-core-4.3.8.RELEASE.jar)。
Spring框架的每個(gè)版本都會(huì)將包Artifact發(fā)布到以下位置:
-
Maven CentralMaven中央倉(cāng)庫(kù)
它是Maven查詢的默認(rèn)存儲(chǔ)庫(kù),不需要任何特殊配置。Spring的許多常見的庫(kù)也可以從Maven Central獲得,Spring框架的大部分功能使用Maven進(jìn)行依賴關(guān)系管理,所以這是很方便的。jar包的名稱是spring-*-<version>.jar,Maven庫(kù)中g(shù)roupId是org.springframework。 - 在專門用于放置Spring框架的公共Maven存儲(chǔ)庫(kù)中。除了最終的GA版本,該存儲(chǔ)庫(kù)還有開發(fā)版
snapshots和里程碑版本milestones。jar包命名格式與Maven Central的格式相同,這樣放置也是很有用的,可以將Spring的開發(fā)版本snapshots與在Maven Central中部署的其他庫(kù)一起使用。該存儲(chǔ)庫(kù)還包含壓縮后的zip文件,其中包含所有Spring框架用到的jar包,壓縮在一起以便于下載。
因此您需要確定的第一件事是如何管理您的依賴關(guān)系:我們通常建議使用像Maven,Gradle或Ivy這樣的自動(dòng)化系統(tǒng),但您也可以通過自己下載所有的jar包來(lái)手動(dòng)進(jìn)行操作。
下面你將會(huì)看到Spring工件的列表。有關(guān)每個(gè)模塊的更完整的描述,請(qǐng)參見第2.2節(jié)“框架模塊”。
表2.1. Spring框架工件
| GroupId | ArtifactId | Description |
|---|---|---|
| org.springframework | spring-aop | 基于代理的AOP |
| org.springframework | spring-aspects | 基于切面的AspectJ |
| org.springframework | spring-beans | Bean支持, 包括Groovy |
| org.springframework | spring-context | 運(yùn)行時(shí)上下文,包括調(diào)度和遠(yuǎn)程調(diào)用抽象 |
| org.springframework | spring-context-support | 包含用于集成第三方庫(kù)到Spring上下文的類 |
| org.springframework | spring-core | 核心庫(kù),被許多其它模塊使用 |
| org.springframework | spring-expression | Spring表達(dá)式語(yǔ)言 |
| org.springframework | spring-instrument | JVM引導(dǎo)的檢測(cè)代理 |
| org.springframework | spring-instrument-tomcat | tomcat的檢測(cè)代理 |
| org.springframework | spring-jdbc | JDBC支持包,包括對(duì)數(shù)據(jù)源設(shè)置和JDBC訪問支持 |
| org.springframework | spring-jms | JMS支持包,包括發(fā)送和接收J(rèn)MS消息的幫助類 |
| org.springframework | spring-messaging | 消息處理的架構(gòu)和協(xié)議 |
| org.springframework | spring-orm | 對(duì)象關(guān)系映射,包括對(duì)JPA和Hibernate支持 |
| org.springframework | spring-oxm | 對(duì)象XML映射 |
| org.springframework | spring-test | 單元測(cè)試和集成測(cè)試組件 |
| org.springframework | spring-tx | 事務(wù)基礎(chǔ),包括對(duì)DAO的支持及JCA的集成 |
| org.springframework | spring-web | web支持包,包括客戶端及web遠(yuǎn)程調(diào)用 |
| org.springframework | spring-webmvc | REST web服務(wù)及web應(yīng)用的MVC實(shí)現(xiàn) |
| org.springframework | spring-webmvc-portlet | 用于Portlet環(huán)境的MVC實(shí)現(xiàn) |
| org.springframework | spring-websocket | WebSocket和SockJS實(shí)現(xiàn),包括對(duì)STOMP的支持 |
Spring的依賴和被依賴
雖然Spring為大量企業(yè)和其他外部工具提供集成和支持,但它有意將其強(qiáng)制性依賴性保持在最低限度:您不必因?yàn)橄胍褂肧pring框架搭建簡(jiǎn)單的用例,而去定位和下載(甚至自動(dòng))大量的jar庫(kù)。對(duì)于基本依賴注入,只有一個(gè)強(qiáng)制性的外部依賴關(guān)系,也就是用于日志記錄(有關(guān)日志記錄選項(xiàng)的更詳細(xì)描述,請(qǐng)參見下文)。
接下來(lái),我們概述了配置依賴于Spring的應(yīng)用程序所需的基本步驟,首先是使用Maven,然后使用Gradle,最后使用Ivy。在任何情況下,如果不清楚,請(qǐng)參閱依賴關(guān)系管理系統(tǒng)的文檔,或查看一些示例代碼 - Spring本身在構(gòu)建時(shí)使用Gradle來(lái)管理依賴關(guān)系,而且我們的示例主要使用Gradle或Maven。
Maven依賴管理
如果您使用Maven進(jìn)行依賴關(guān)系管理,則甚至不需要顯式提供記錄依賴關(guān)系。例如,要?jiǎng)?chuàng)建應(yīng)用程序上下文并使用依賴注入來(lái)配置應(yīng)用程序,您的Maven依賴項(xiàng)將如下所示:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.8.RELEASE</version>
<scope>runtime</scope>
</dependency>
</dependencies>
就這樣,注意如果不需要編譯Spring API,可以把scope聲明為runtime,這是依賴注入使用的典型案例。
上面的示例使用Maven中央倉(cāng)庫(kù),如果使用Spring的Maven倉(cāng)庫(kù)(例如,里程碑版本milestones或開發(fā)快照版本snapshots),需要在Maven配置中指定倉(cāng)庫(kù)位置。
release版本:
<repositories>
<repository>
<id>io.spring.repo.maven.release</id>
<url>http://repo.spring.io/release/</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
里程碑版本
<repositories>
<repository>
<id>io.spring.repo.maven.milestone</id>
<url>http://repo.spring.io/milestone/</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
開發(fā)快照版本
<repositories>
<repository>
<id>io.spring.repo.maven.snapshot</id>
<url>http://repo.spring.io/snapshot/</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
Maven“物料清單式”依賴
使用Maven時(shí),可能會(huì)意外混合不同版本的Spring JAR包。例如,您可能從第三方庫(kù)中下載,或另一個(gè)Spring項(xiàng)目存在舊的版本依賴。如果您忘記自己明確聲明直接依賴,可能會(huì)出現(xiàn)各種意外問題。
為了克服這些問題,Maven支持“物料單”(BOM)依賴的概念。您可以導(dǎo)入spring-framework-bom到您的dependencyManagement部分,以確保所有Spring依賴(直接和傳遞)都是相同的版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.3.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
使用BOM的一個(gè)額外的好處是,您不再需要在引用Spring框架工件時(shí)去指定<version>屬性了:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependencies>
Gradle依賴關(guān)系管理
為了在Gradle構(gòu)建系統(tǒng)中使用Spring倉(cāng)庫(kù),需要在repositories部分包含合適的URL:
repositories {
mavenCentral()
// and optionally...
maven { url "http://repo.spring.io/release" }
}
可以酌情把repositories URL中的/release修改為/milestone或/snapshot。一旦倉(cāng)庫(kù)配置好了,就可以按Gradle的方式聲明依賴關(guān)系了。
dependencies {
compile("org.springframework:spring-context:4.3.8.RELEASE")
testCompile("org.springframework:spring-test:4.3.8.RELEASE")
}
Ivy依賴關(guān)系管理
使用Ivy管理依賴關(guān)系有相似的配置選項(xiàng)。
在ivysettings.xml中添加resolver配置使Ivy指向Spring倉(cāng)庫(kù):
<resolvers>
<ibiblio name="io.spring.repo.maven.release"
m2compatible="true"
root="http://repo.spring.io/release/"/>
</resolvers>
可以酌情把root URL中的/release修改為/milestone或/snapshot。
一旦配置好了,就可以按照慣例添加依賴了(在ivy.xml中):
發(fā)行版的Zip文件
雖然使用支持依賴管理的構(gòu)建系統(tǒng)是獲取Spring框架的推薦方法,但是也支持通過下載Spring的發(fā)行版zip文件獲取。
發(fā)行版zip文件發(fā)布在了Sprng的Maven倉(cāng)庫(kù)上(這只是為了方便,不需要額外的Maven或其它構(gòu)建系統(tǒng)去下載它們)。
瀏覽器中打開http://repo.spring.io/release/org/springframework/spring,并選擇合適版本的子目錄,就可以下載發(fā)行版的zip文件了。發(fā)行文件以-dist.zip結(jié)尾,例如,spring-framework-{spring-version}-RELEASE-dist.zip。發(fā)行文件也包含里程碑版本和快照版本。
2.3.2 日志記錄
日志記錄是Spring非常重要的功能依賴,因?yàn)閍) 它是唯一的強(qiáng)制性外部依賴關(guān)系,b) 每個(gè)人都喜歡看到他們使用的工具的一些輸出,c) Spring集成了許多其他工具,它們都選擇了日志依賴關(guān)系。
應(yīng)用程序開發(fā)人員的目標(biāo)之一通常是將統(tǒng)一的日志記錄配置在整個(gè)應(yīng)用程序的中央位置,包括所有外部組件。這比以前更加困難,因?yàn)槿罩究蚣苡刑噙x擇。
Spring中的強(qiáng)制性日志依賴關(guān)系是Jakarta Commons Logging API(JCL)。我們針對(duì)JCL進(jìn)行編譯,我們也使JCL Log對(duì)象對(duì)于擴(kuò)展Spring Framework的類可見。對(duì)于用戶來(lái)說(shuō),所有版本的Spring都使用相同的日志庫(kù),這樣做非常重要,這樣做以后遷移很簡(jiǎn)單,因?yàn)榧词箶U(kuò)展Spring的應(yīng)用程序仍然保留向后兼容性。我們這樣做的方法是使Spring中的一個(gè)模塊明確地依賴于commons-logging(JCL的規(guī)范實(shí)現(xiàn)),然后在編譯時(shí)使所有其他模塊依賴于它。例如,如果您使用Maven,并且想知道您在哪里選擇對(duì)commons-logging的依賴關(guān)系,那么它來(lái)自Spring,特別是來(lái)自中央模塊spring-core。
使用commons-logging更為方便的是,你不需要任何其他東西來(lái)使你的應(yīng)用程序工作。它具有運(yùn)行時(shí)發(fā)現(xiàn)算法,可以在配置的類路徑中查找其他日志記錄框架,并使用它認(rèn)為合適的記錄框架(或者您可以告訴它需要哪一個(gè))。如果沒有其他可用的,您可以從JDK(簡(jiǎn)稱java.util.logging或JUL)獲得非常實(shí)用的日志。由此你可以發(fā)現(xiàn),在大多數(shù)情況下,你的Spring程序都可以正常的工作,并且能夠輸出信息到控制臺(tái),這是很重要的。
使用Log4j 1.2或者2.x
Log4j 1.2在此期間是EOL。此外,Log4j 2.3是最新的Java 6兼容版本,較新的Log4j 2.x版本需要Java 7+版本。
許多人使用Log4j作為配置和管理目的的日志框架。它高效且成熟,實(shí)際上在我們?cè)跇?gòu)建Spring時(shí),它是在運(yùn)行時(shí)使用的。Spring還提供了一些用于配置和初始化Log4j的實(shí)用程序,因此它在某些模塊中對(duì)Log4j具有可選的編譯時(shí)依賴性。
要使Log4j 1.2使用默認(rèn)的JCL依賴項(xiàng)(commons-logging),您需要做的就是將Log4j放在類路徑上,并為其提供配置文件(log4j.properties或log4j.xml在類路徑的根目錄中)。所以對(duì)于Maven用戶來(lái)說(shuō),這是你的依賴聲明:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
下面是輸出日志到控制臺(tái)的log4j.properties配置文件:
log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
log4j.category.org.springframework.beans.factory=DEBUG
要使用Log4j 2.X與JCL,你需要做的就是把Log4j放到在類路徑下,并為其提供一個(gè)配置文件(log4j2.xml,log4j2.properties或其他支持的配置格式)。對(duì)于Maven用戶,所需的最小依賴關(guān)系是:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
如果您還希望啟用SLF4J委托Log4j,例如默認(rèn)使用SLF4J的其他庫(kù),則還需要以下依賴關(guān)系:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
以下是使出日志到控制臺(tái)的示例配置文件log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.springframework.beans.factory" level="DEBUG"/>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
避免使用Commons Logging
不幸的是,標(biāo)準(zhǔn)commons-loggingAPI中的運(yùn)行時(shí)發(fā)現(xiàn)算法對(duì)于最終用戶來(lái)說(shuō)方便,但是可能是有問題的。如果你想避免JCL的標(biāo)準(zhǔn)查找,基本上有兩種方法來(lái)關(guān)閉它:
- 從
spring-core模塊中排除依賴關(guān)系(因?yàn)樗俏ㄒ幻鞔_依賴的模塊commons-logging)
- 取決于一個(gè)特殊的
commons-logging依賴關(guān)系,用空的jar代替庫(kù)(更多的細(xì)節(jié)可以在SLF4J FAQ中找到 )
要排除公共記錄,請(qǐng)將以下內(nèi)容添加到您的dependencyManagement部分:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.8.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
現(xiàn)在這個(gè)應(yīng)用程序目前被破壞,因?yàn)樵陬惵窂街袥]有實(shí)現(xiàn)JCL API,所以要修復(fù)它,必須提供一個(gè)新的JCL API。在下一節(jié)中,我們向您展示如何使用SLF4J提供JCL的替代實(shí)現(xiàn)。
使用SLF4J與Log4j或Logback
Java簡(jiǎn)單日志模式(SLF4J)是Spring常用的其他庫(kù)流行API。它通常配合SLF4J API本地化的Logback使用。
SLF4J提供了綁定到許多常見的日志記錄框架的功能,包括Log4j,并且它也可以完成相反的工作:其他日志記錄框架和其自身之間的橋梁。所以要使用SLF4J與Spring,您需要使用SLF4J-JCL橋替代commons-logging的依賴關(guān)系配置。一旦完成,那么在Spring中記錄調(diào)用將被轉(zhuǎn)換為對(duì)SLF4J API的記錄調(diào)用,因此如果應(yīng)用程序中的其他庫(kù)使用該API,那么就會(huì)有一個(gè)單獨(dú)的地方來(lái)配置和管理日志記錄。
常見的選擇可能是將Spring鏈接到SLF4J,然后提供從SLF4J到Log4j的顯式綁定。您需要提供幾個(gè)依賴關(guān)系(并排除現(xiàn)有的commons-logging):JCL橋接器,SLF4j綁定到Log4j,以及Log4j提供器。在Maven中,你可以這樣做
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.8.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
SLF4J用戶更為常見的選擇,是使用較少的步驟以及生成更少的依賴關(guān)系,就是直接綁定到Logback。因?yàn)橹苯拥膌ogback實(shí)現(xiàn)SLF4J,也會(huì)消除多余的綁定步驟,所以你只需要僅僅依靠?jī)蓚€(gè)庫(kù),即jcl-over-slf4j和logback):
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
</dependencies>
使用JUL(java.util.logging)
只要在類路徑中沒有檢測(cè)到Log4j,Commons Logging都會(huì)默認(rèn)委派java.util.logging。所以沒有什么特別的依賴關(guān)系:在一個(gè)獨(dú)立的應(yīng)用程序(在JDK級(jí)別使用自定義或默認(rèn)的JUL設(shè)置)中只要在使用Spring是沒有配置外部依賴,日志輸出就會(huì)使用java.util.logging,或應(yīng)用程序服務(wù)器的日志系統(tǒng)(和它的系統(tǒng)級(jí)JUL設(shè)置)。
Commons登錄WebSphere
Spring應(yīng)用程序可以在本身提供JCL實(shí)現(xiàn)的容器上運(yùn)行,例如IBM的WebSphere Application Server(WAS)。這并不會(huì)導(dǎo)致問題本身,而是導(dǎo)致需要了解的兩種不同的場(chǎng)景:
在“父級(jí)第一”ClassLoader授權(quán)模型(WAS中的默認(rèn)值)中,應(yīng)用程序?qū)⑹冀K選擇Commons Logging提供的服務(wù)器版本,委托給WAS記錄子系統(tǒng)(實(shí)際上基于JUL)。JCL的應(yīng)用程序提供的變量,無(wú)論是標(biāo)準(zhǔn)的Commons Logging還是JCL-over-SLF4J橋,都將被有效地被忽略,以及任何本地包含的日志提供程序。
使用“父進(jìn)程”委托模式(常規(guī)Servlet容器中的默認(rèn)值,WAS上的顯式配置選項(xiàng)),在您的應(yīng)用程序中,將提取應(yīng)用程序提供的Commons Logging變量,使您能夠設(shè)置本地包含的日志提供程序,例如Log4j或Logback。在沒有本地日志提供程序的情況下,默認(rèn)情況下,常規(guī)Commons Logging將委托給JUL,有效地記錄到WebSphere的日志記錄子系統(tǒng),同“父級(jí)第一”方案一致。
總而言之,我們建議將“Spring”應(yīng)用程序部署在“父進(jìn)程”模式中,因?yàn)樗匀坏卦试S本地提供程序以及服務(wù)器的日志子系統(tǒng)。