官方文檔地址: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
版權所有? 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.
只要您不對這些副本收取任何費用,并且進一步規定,每個副本都包含本版權聲明,無論是以印刷版還是電子版分發,本文檔的副本可供您自己使用并分發給他人。
第一部分 Spring框架概述
Spring Framework是一個輕量級解決方案,可以一站式的構建企業級應用程序。但是,Spring是模塊化的,允許使用部分所需的部件,而不使用其余的部件。可以在任何Web框架上使用控制反轉(IoC),也可以僅僅是用 Hibernate集成代碼或者JDBC抽象層。Spring框架支持聲明式事務管理,通過RMI或Web服務遠程訪問您的邏輯,以及用于持久存儲數據的各種選項。它提供了一個全功能的MVC框架,使您能夠將AOP透明地集成到您的軟件中。
Spring被設計為非侵入性的,這意味著您的域邏輯代碼通常不依賴于框架本身。在集成層(如數據訪問層)中,會存在一些依賴同時依賴于數據訪問技術和Spring,但是這些依賴可以很容易地從代碼庫中分離出來。
本文檔是Spring Framework功能的參考指南。如果您對本文檔有任何要求,意見或問題,請將其發布在 用戶郵件列表中。或者在StackOverflow上詢問框架本身的問題(請參閱https://spring.io/questions)。
1. Spring入門
本參考指南提供有關Spring框架的詳細信息。它為所有功能提供了全面的文檔,以及Spring所提供的基本概念(如“依賴注入”)的背景知識。
如果您剛開始使用Spring,可以通過創建一個 Spring Boot的基本應用程序來開始使用Spring框架。Spring Boot提供了一種快速(有選擇的)的方式創建一個基于生產的Spring應用程序。它基于Spring框架,有利于配置的設定,從而使得程序盡快開始運行。
您可以使用start.spring.io生成一個基本項目,或按照“入門指南”中的一個指南,例如開始創建RESTful 項目入門 。除了易于理解以外,這些指南非常任務化,大部分都是基于Spring Boot。他們還涵蓋了Spring解決方案中您可能想要考慮的其他項目。
2. Spring框架介紹
Spring 框架是一個Java平臺,為開發Java應用程序提供全面的基礎設施支持。Spring很好的處理了基礎設施,因此可以專注于應用程序開發。
Spring使您能夠從“簡單的Java對象”(POJO)構建應用程序,并將企業服務非侵入式應用于POJO。此功能適用于Java SE編程模型以及完整和部分的Java EE。
那么作為應用程序開發人員,我們可以從Spring平臺中得到什么呢:
- 使Java方法在數據庫事務中執行,而不必處理事務API。
- 使本地Java方法成為HTTP端點,而無需處理Servlet API。
- 使本地Java方法成為消息處理程序,而無需處理JMS API。
- 使本地Java方法成為管理操作,而無需處理JMX API。
2.1依賴注入和控制反轉
一個Java應用程序,從受限制的嵌入式應用到n層的服務端應用,典型地是由相互合作的對象組成的,因此,一個應用程序中的對象是相互依賴的。
雖然Java平臺提供了豐富的應用程序開發功能,但它缺乏將基本構建塊組織成一個連貫的整體的方法,將該任務留給架構師和開發人員。可以使用工廠模式Factory
,抽象工廠模式Abstract Factory
,創建者模式Builder
,裝飾者模式Decorator
和服務定位器模式Service Locator
等設計模式來構成構成應用程序的各種類和對象實例,這些模式是簡單的:因為框架給出這些設計模式名稱對應的最佳實踐,以及什么樣的模式,應用于哪里,它解決的問題等等。這些設計模式都是最佳實踐的結晶,所以你應該在你的應用程序中使用它們。
Spring的控制反轉解決了上述問題,它提供了一種正式的解決方案,你可以把不相干組件組合在一起,從而組成一個完整的可以使用的應用。Spring根據設計模式編碼出了非常優秀的代碼,所以可以直接集成到自己的應用中。因此,大量的組織機構都使用Spring來保證應用程序的健壯性和可維護性。
**背景**
Martin Fowler 在2004年在他的網站上提出了關于控制反轉(IoC)的問題“The question is, what aspect of control are [they] inverting?”。
Fowler 由此建議重新命名這個原則,使其更加清晰明了,并提出依賴注入。
2.2框架模塊
Spring框架由組織成約20個模塊的功能組成。這些模塊分為核心容器Core Container
,數據訪問/集成Data Access / Integration
,Web
,AOP
(面向對象編程),Instrumentation
,消息處理Messaging
和測試Test
,如下圖所示。
以下部分列出了每個功能對應的模塊及主題,并且提供功能的Artifact name
。Artifact name
與依賴關系管理工具中使用的Artifact name
相關聯。
2.2.1核心集裝箱Core Container
核心容器spring-core
, spring-beans
,spring-context
,spring-context-support
,和spring-expression
(Spring表達式語言)多個模塊組成。
spring-core
和spring-beans
模塊是Spring框架的基礎,包括IoC控制反轉和依賴注入。而BeanFactory
是工廠模式的復雜實現。它消除了對編程單例的需要,并允許將依賴關系的配置和規范與實際程序邏輯分離。
Spring上下文模塊spring-context
建立在Spring核心Core
和Bean
模塊之上:它以一個JNDI注冊的方式去訪問一個對象。上下文模塊Context
繼承自Beans
模塊,并增加了對國際化的支持(例如使用資源束),事件傳播,資源加載以及透明創建上下文對象,例如Servlet容器。Context
模塊還支持Java EE功能,如EJB,JMX(Java Management Extensions
,即Java管理擴展)和基本遠程處理。ApplicationContext
接口是上下文模塊的關鍵點。spring-context-support
支持將常見的第三方庫集成到Spring應用程序上下文緩存(EhCache,Guava,JCache),郵件(JavaMail),調度(CommonJ,Quartz)和模版引擎(FreeMarker,JasperReports,Velocity)中
spring-expression
模塊提供了強大的表達式語言,用于在運行時查詢和操作對象圖。它是JSP 2.1規范中規定的統一表達語言(統一EL)的擴展。該語言支持設置和獲取屬性值,屬性分配,方法調用,訪問數組,集合和索引器的內容,邏輯和算術運算符,命名變量以及從Spring的IoC容器中以名稱檢索對象。它還支持列表投影和選擇以及常見列表聚合。
2.2.2 AOP和檢測Instrumentation
spring-aop
模塊提供了一個符合AOP聯盟標準的面向對象的編程實現,允許您定義方法攔截器和切入點,用于分離實現可分離的功能代碼。使用源級別元數據功能,您還可以以類似于.NET屬性的方式將行為信息合并到代碼中。
獨立的spring-aspects
模塊提供與AspectJ
(一個面向切面的框架)的集成。
spring-instrument
模塊提供了對檢測類的支持和用于特定的應用服務器的類加載器的實現。spring-instrument-tomcat
模塊包含用與Tomcat的Spring測試代理。
2.2.3消息傳遞
Spring 4包含的spring-messaging
是從Spring集成項目中抽象出來的模塊,例如Message
、MessageChannel
、MessageHandler
,和其他基于消息的基礎應用程序。該模塊還包括一組用于將消息映射到方法的注釋,類似于基于Spring MVC注釋的編程模型。
2.2.4數據訪問/集成
數據訪問/集成層由JDBC,ORM,OXM,JMS和事務模塊組成。
spring-jdbc
模塊提供了一個JDBC抽象層,可以省去冗長的JDBC編碼和解析數據庫供應商特定錯誤代碼的需要。
spring-tx
模塊支持編程式事務和聲明式事務,可用于實現了特定接口的類和所有的POJO對象。
(譯者注:編程式事務需要自己寫beginTransaction()、commit()、rollback()等事務管理方法,聲明式事務是通過注解或配置由spring自動處理,編程式事務粒度更細)
spring-orm
模塊為流行的對象關系映射API提供集成層 ,包括JPA, JDO和Hibernate。使用spring-orm模塊,您可以將所有這些O/RMapping框架與Spring提供的所有其他功能結合使用,例如前面提到的簡單的聲明式事務管理功能。
spring-oxm
模塊提供了一個支持Object/XML映射實現(如JAXB,Castor,XMLBeans,JiBX和XStream)的抽象層。
spring-jms
模塊(Java消息服務)包含用于生成和消費消息的功能。自Spring Framework 4.1以來,它提供了與spring-messaging
模塊的集成。
2.2.5 網絡Web
網絡層由spring-web
,spring-webmvc
,spring-websocket
,和 spring-webmvc-portlet
模塊組成。
spring-web
模塊提供基本的面向Web的集成功能,例如多部分multipart
文件上傳功能,使用Servlet監聽器初始化IoC容器等。它還包含一個HTTP客戶端和Spring的遠程支持的Web相關部分。
spring-webmvc
模塊(也稱為Web-Servlet
模塊)包含用于Web應用程序的Spring的模型視圖控制器model-view-controller
(MVC)和REST Web Services實現。Spring MVC架構提供了領域模型代碼和Web表單之間的分離,并與Spring框架的其他所有功能集成。
spring-webmvc-portlet
模塊(也稱為Web-Portlet
模塊)提供了在Portlet環境中使用的MVC實現,并反映了基于Servlet的spring-webmvc
模塊的功能。
2.2.6測試
spring-test
模塊支持使用JUnit或TestNG對Spring組件進行單元測試和集成測試。它提供一致性加載和Spring應用程序上下文ApplicationContext,以及緩存這些上下文。它還提供可用于獨立測試代碼的模擬對象的功能。
2.3使用場景
之前描述的構建塊使Spring成為許多場景中的邏輯選擇,不管是在資源受限設備上運行的嵌入式應用程序,或者使用Spring的事務管理功能和Web框架集成的企業級應用程序。
Spring的聲明式事務管理功能使Web應用程序完全事務性,就像使用EJB容器管理的事務一樣。所有您的定制業務邏輯都可以使用簡單的POJO實現,并由Spring的IoC容器進行管理。附加服務包括支持發送電子郵件和獨立于Web層的驗證,可讓您選擇執行驗證規則的位置。Spring的ORM支持與JPA,Hibernate和JDO集成; 例如,當使用Hibernate時,您可以繼續使用現有的映射文件和標準的Hibernate SessionFactory
配置。表單控制器將Web層與域模型無縫集成,移除了將ActionFormsHTTP
參數轉換為域模型的值或其他類的需求。
有時情況不允許你完全切換到不同的框架。Spring框架不會強制使用其內的所有模塊; 這不是一個要么全有,要么全沒有的解決方案。使用Struts
,Tapestry
,JSF
或其他UI框架構建的現有前端可以與基于Spring的中間層集成,從而允許您使用Spring事務功能。您只需使用一個應用程序上下文對象ApplicationContext
連接您的業務邏輯,并使用WebApplicationContext
來集成Web層。
當你需要通過Web服務來訪問現有的代碼,你可以使用Spring框架的的Hessian-
,Burlap-
,Rmi-
或JaxRpcProxyFactory
類。啟用對現有應用程序的遠程訪問并不困難。
Spring框架還為Enterprise JavaBeans
提供了一個訪問抽象層,使您能夠重用現有的POJO,并將其包裝在無狀態會話bean
中,以用于可能需要聲明式安全性的可擴展的,故障安全的Web應用程序。
2.3.1依賴管理和命名約定
依賴關系管理和依賴注入是不同的。為了將Spring的這些不錯的功能引入到應用程序中(如依賴注入),您需要組裝所有需要的庫(jar文件),并在運行時和編譯時將它們導入到類路徑中。這些依賴關系不是注入的虛擬組件,而是文件系統中的物理資源(通常情況下如此)。依賴關系管理的過程包括定位這些資源,存儲它們并將其添加到類路徑中。依賴關系可以是直接的(例如,我的應用程序在運行時依賴Spring)或間接(例如我的應用程序取決于commons-dbcp
哪個依賴于commons-pool
)。間接依賴關系也被稱為“傳遞性”,它們是最難識別和管理的依賴關系。
如果你要使用Spring框架,你需要獲得一個包含你所需要的Spring塊的jar庫的副本。為了使獲取更容易,Spring框架被打包為一組盡可能分離依賴關系的模塊,例如,如果您不想編寫Web應用程序,則不需要spring-web
模塊。本指南中,我們使用速記命名約定到Spring庫模塊spring-*
或 spring-*.jar
,其中*代表該模塊的短名稱(例如spring-core
, spring-webmvc
, spring-jms
等)。您使用的實際jar文件名通常是用模塊名稱與版本號連接(例如spring-core-4.3.8.RELEASE.jar
)。
Spring框架的每個版本都會將包Artifact
發布到以下位置:
-
Maven Central
Maven中央倉庫
它是Maven查詢的默認存儲庫,不需要任何特殊配置。Spring的許多常見的庫也可以從Maven Central
獲得,Spring框架的大部分功能使用Maven進行依賴關系管理,所以這是很方便的。jar包的名稱是spring-*-<version>.jar
,Maven庫中groupId是org.springframework
。 - 在專門用于放置Spring框架的公共Maven存儲庫中。除了最終的GA版本,該存儲庫還有開發版
snapshots
和里程碑版本milestones
。jar包命名格式與Maven Central的格式相同,這樣放置也是很有用的,可以將Spring的開發版本snapshots
與在Maven Central中部署的其他庫一起使用。該存儲庫還包含壓縮后的zip文件,其中包含所有Spring框架用到的jar包,壓縮在一起以便于下載。
因此您需要確定的第一件事是如何管理您的依賴關系:我們通常建議使用像Maven
,Gradle
或Ivy
這樣的自動化系統,但您也可以通過自己下載所有的jar包來手動進行操作。
下面你將會看到Spring工件的列表。有關每個模塊的更完整的描述,請參見第2.2節“框架模塊”。
表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 | 運行時上下文,包括調度和遠程調用抽象 |
org.springframework | spring-context-support | 包含用于集成第三方庫到Spring上下文的類 |
org.springframework | spring-core | 核心庫,被許多其它模塊使用 |
org.springframework | spring-expression | Spring表達式語言 |
org.springframework | spring-instrument | JVM引導的檢測代理 |
org.springframework | spring-instrument-tomcat | tomcat的檢測代理 |
org.springframework | spring-jdbc | JDBC支持包,包括對數據源設置和JDBC訪問支持 |
org.springframework | spring-jms | JMS支持包,包括發送和接收JMS消息的幫助類 |
org.springframework | spring-messaging | 消息處理的架構和協議 |
org.springframework | spring-orm | 對象關系映射,包括對JPA和Hibernate支持 |
org.springframework | spring-oxm | 對象XML映射 |
org.springframework | spring-test | 單元測試和集成測試組件 |
org.springframework | spring-tx | 事務基礎,包括對DAO的支持及JCA的集成 |
org.springframework | spring-web | web支持包,包括客戶端及web遠程調用 |
org.springframework | spring-webmvc | REST web服務及web應用的MVC實現 |
org.springframework | spring-webmvc-portlet | 用于Portlet環境的MVC實現 |
org.springframework | spring-websocket | WebSocket和SockJS實現,包括對STOMP的支持 |
Spring的依賴和被依賴
雖然Spring為大量企業和其他外部工具提供集成和支持,但它有意將其強制性依賴性保持在最低限度:您不必因為想要使用Spring框架搭建簡單的用例,而去定位和下載(甚至自動)大量的jar庫。對于基本依賴注入,只有一個強制性的外部依賴關系,也就是用于日志記錄(有關日志記錄選項的更詳細描述,請參見下文)。
接下來,我們概述了配置依賴于Spring的應用程序所需的基本步驟,首先是使用Maven,然后使用Gradle,最后使用Ivy。在任何情況下,如果不清楚,請參閱依賴關系管理系統的文檔,或查看一些示例代碼 - Spring本身在構建時使用Gradle來管理依賴關系,而且我們的示例主要使用Gradle或Maven。
Maven依賴管理
如果您使用Maven進行依賴關系管理,則甚至不需要顯式提供記錄依賴關系。例如,要創建應用程序上下文并使用依賴注入來配置應用程序,您的Maven依賴項將如下所示:
<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中央倉庫,如果使用Spring的Maven倉庫(例如,里程碑版本milestones
或開發快照版本snapshots
),需要在Maven配置中指定倉庫位置。
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>
開發快照版本
<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時,可能會意外混合不同版本的Spring JAR包。例如,您可能從第三方庫中下載,或另一個Spring項目存在舊的版本依賴。如果您忘記自己明確聲明直接依賴,可能會出現各種意外問題。
為了克服這些問題,Maven支持“物料單”(BOM)依賴的概念。您可以導入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的一個額外的好處是,您不再需要在引用Spring框架工件時去指定<version>
屬性了:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependencies>
Gradle依賴關系管理
為了在Gradle構建系統中使用Spring倉庫,需要在repositories
部分包含合適的URL:
repositories {
mavenCentral()
// and optionally...
maven { url "http://repo.spring.io/release" }
}
可以酌情把repositories
URL中的/release
修改為/milestone
或/snapshot
。一旦倉庫配置好了,就可以按Gradle的方式聲明依賴關系了。
dependencies {
compile("org.springframework:spring-context:4.3.8.RELEASE")
testCompile("org.springframework:spring-test:4.3.8.RELEASE")
}
Ivy依賴關系管理
使用Ivy管理依賴關系有相似的配置選項。
在ivysettings.xml
中添加resolver配置使Ivy指向Spring倉庫:
<resolvers>
<ibiblio name="io.spring.repo.maven.release"
m2compatible="true"
root="http://repo.spring.io/release/"/>
</resolvers>
可以酌情把root
URL中的/release
修改為/milestone
或/snapshot
。
一旦配置好了,就可以按照慣例添加依賴了(在ivy.xml
中):
發行版的Zip文件
雖然使用支持依賴管理的構建系統是獲取Spring框架的推薦方法,但是也支持通過下載Spring的發行版zip文件獲取。
發行版zip文件發布在了Sprng的Maven倉庫上(這只是為了方便,不需要額外的Maven或其它構建系統去下載它們)。
瀏覽器中打開http://repo.spring.io/release/org/springframework/spring,并選擇合適版本的子目錄,就可以下載發行版的zip文件了。發行文件以-dist.zip
結尾,例如,spring-framework-{spring-version}-RELEASE-dist.zip。發行文件也包含里程碑版本和快照版本。
2.3.2 日志記錄
日志記錄是Spring非常重要的功能依賴,因為a) 它是唯一的強制性外部依賴關系,b) 每個人都喜歡看到他們使用的工具的一些輸出,c) Spring集成了許多其他工具,它們都選擇了日志依賴關系。
應用程序開發人員的目標之一通常是將統一的日志記錄配置在整個應用程序的中央位置,包括所有外部組件。這比以前更加困難,因為日志框架有太多選擇。
Spring中的強制性日志依賴關系是Jakarta Commons Logging API
(JCL)。我們針對JCL進行編譯,我們也使JCL Log對象對于擴展Spring Framework的類可見。對于用戶來說,所有版本的Spring都使用相同的日志庫,這樣做非常重要,這樣做以后遷移很簡單,因為即使擴展Spring的應用程序仍然保留向后兼容性。我們這樣做的方法是使Spring中的一個模塊明確地依賴于commons-logging
(JCL的規范實現),然后在編譯時使所有其他模塊依賴于它。例如,如果您使用Maven,并且想知道您在哪里選擇對commons-logging
的依賴關系,那么它來自Spring,特別是來自中央模塊spring-core
。
使用commons-logging
更為方便的是,你不需要任何其他東西來使你的應用程序工作。它具有運行時發現算法,可以在配置的類路徑中查找其他日志記錄框架,并使用它認為合適的記錄框架(或者您可以告訴它需要哪一個)。如果沒有其他可用的,您可以從JDK(簡稱java.util.logging
或JUL)獲得非常實用的日志。由此你可以發現,在大多數情況下,你的Spring程序都可以正常的工作,并且能夠輸出信息到控制臺,這是很重要的。
使用Log4j 1.2或者2.x
Log4j 1.2在此期間是EOL。此外,Log4j 2.3是最新的Java 6兼容版本,較新的Log4j 2.x版本需要Java 7+版本。
許多人使用Log4j作為配置和管理目的的日志框架。它高效且成熟,實際上在我們在構建Spring時,它是在運行時使用的。Spring還提供了一些用于配置和初始化Log4j的實用程序,因此它在某些模塊中對Log4j具有可選的編譯時依賴性。
要使Log4j 1.2使用默認的JCL依賴項(commons-logging
),您需要做的就是將Log4j放在類路徑上,并為其提供配置文件(log4j.properties
或log4j.xml
在類路徑的根目錄中)。所以對于Maven用戶來說,這是你的依賴聲明:
<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>
下面是輸出日志到控制臺的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放到在類路徑下,并為其提供一個配置文件(log4j2.xml
,log4j2.properties
或其他支持的配置格式)。對于Maven用戶,所需的最小依賴關系是:
<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,例如默認使用SLF4J的其他庫,則還需要以下依賴關系:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
以下是使出日志到控制臺的示例配置文件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
不幸的是,標準commons-logging
API中的運行時發現算法對于最終用戶來說方便,但是可能是有問題的。如果你想避免JCL的標準查找,基本上有兩種方法來關閉它:
- 從
spring-core
模塊中排除依賴關系(因為它是唯一明確依賴的模塊commons-logging
)
- 取決于一個特殊的
commons-logging
依賴關系,用空的jar代替庫(更多的細節可以在SLF4J FAQ中找到 )
要排除公共記錄,請將以下內容添加到您的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>
現在這個應用程序目前被破壞,因為在類路徑中沒有實現JCL API,所以要修復它,必須提供一個新的JCL API。在下一節中,我們向您展示如何使用SLF4J提供JCL的替代實現。
使用SLF4J與Log4j或Logback
Java簡單日志模式(SLF4J)是Spring常用的其他庫流行API。它通常配合SLF4J API本地化的Logback
使用。
SLF4J提供了綁定到許多常見的日志記錄框架的功能,包括Log4j,并且它也可以完成相反的工作:其他日志記錄框架和其自身之間的橋梁。所以要使用SLF4J與Spring,您需要使用SLF4J-JCL橋替代commons-logging
的依賴關系配置。一旦完成,那么在Spring中記錄調用將被轉換為對SLF4J API的記錄調用,因此如果應用程序中的其他庫使用該API,那么就會有一個單獨的地方來配置和管理日志記錄。
常見的選擇可能是將Spring鏈接到SLF4J,然后提供從SLF4J到Log4j的顯式綁定。您需要提供幾個依賴關系(并排除現有的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用戶更為常見的選擇,是使用較少的步驟以及生成更少的依賴關系,就是直接綁定到Logback。因為直接的logback實現SLF4J,也會消除多余的綁定步驟,所以你只需要僅僅依靠兩個庫,即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
)
只要在類路徑中沒有檢測到Log4j,Commons Logging都會默認委派java.util.logging
。所以沒有什么特別的依賴關系:在一個獨立的應用程序(在JDK級別使用自定義或默認的JUL設置)中只要在使用Spring是沒有配置外部依賴,日志輸出就會使用java.util.logging
,或應用程序服務器的日志系統(和它的系統級JUL設置)。
Commons登錄WebSphere
Spring應用程序可以在本身提供JCL實現的容器上運行,例如IBM的WebSphere Application Server
(WAS)。這并不會導致問題本身,而是導致需要了解的兩種不同的場景:
在“父級第一”ClassLoader授權模型(WAS中的默認值)中,應用程序將始終選擇Commons Logging提供的服務器版本,委托給WAS記錄子系統(實際上基于JUL)。JCL的應用程序提供的變量,無論是標準的Commons Logging還是JCL-over-SLF4J
橋,都將被有效地被忽略,以及任何本地包含的日志提供程序。
使用“父進程”委托模式(常規Servlet容器中的默認值,WAS上的顯式配置選項),在您的應用程序中,將提取應用程序提供的Commons Logging變量,使您能夠設置本地包含的日志提供程序,例如Log4j或Logback。在沒有本地日志提供程序的情況下,默認情況下,常規Commons Logging將委托給JUL,有效地記錄到WebSphere的日志記錄子系統,同“父級第一”方案一致。
總而言之,我們建議將“Spring”應用程序部署在“父進程”模式中,因為它自然地允許本地提供程序以及服務器的日志子系統。