Spring 5 官方文檔》1. Spring入門指南

Spring 5 官方文檔》1. Spring入門指南

原文鏈接  譯者:胡永

1.Spring入門指南

本參考指南提供了有關Spring Framework的詳細信息。它全面的介紹了Spring的所有的功能,以及Spring涉及的基礎概念(如“依賴注入” “Dependency Injection”)。

如果你是剛開始使用Spring,你可能需要首先創建一個Spring Boot應用程序來開始Spring框架之旅。Spring Boot提供了一個快速(和自治的)的方式來創建一個基於Spring的生產環境。它是基於Spring框架,支持約定優於配置,並且被設計成儘可能快地讓你啓動和運行程序。

您可以使用start.spring.io生成一個基本項目或按照新手入門指南裏的任意一個指南構建項目,例如構建一個RESTful Web服務入門指南 。爲了更容易幫助你理解,這些指南都是面向任務的,其中大部分都是基於Spring Boot的。 他們還涵蓋了很多Spring原型工程,在您需要解決特定問題時可以考慮使用他們。

2.介紹Spring框架

Spring 框架是一個Java平臺,它爲開發Java應用程序提供全面的基礎架構支持。Spring負責基礎架構,因此您可以專注於應用程序的開發。

Spring可以讓您從“plain old Java objects”(POJO)中構建應用程序和通過非侵入性的POJO實現企業應用服務。此功能適用於Java SE的編程模型,全部的或部分的適應Java EE模型。

這些例子告訴你,作爲一個應用程序開發人員,如何從Spring平臺中受益:

  • 寫一個Java方法執行數據庫事務,而無需處理具體事務的APIs。
  • 寫一個本地Java方法去遠程調用,而不必處理遠程調用的APIs。
  • 寫一個本地Java方法實現管理操作,而不必處理JMX APIs。
  • 寫一個本地Java方法實現消息處理,而不必處理JMS APIs。

2.1依賴注入和控制反轉

Java應用程序-這是一個寬鬆的術語,它包括的範圍從受限的嵌入式應用程序到n層的服務器端企業應用程序-通常組成程序的對象互相協作而構成正確的應用程序。因此,在一個應用程序中的對象彼此具有依賴關係(dependencies)。

雖然Java平臺提供了豐富的應用程序開發功能,但它缺乏將基本的模塊組織成一個整體的方法,而將該任務留給了架構師和開發人員。雖然你可以使用如工廠抽象工廠Builder裝飾器Service Locator等 設計模式來構建各種類和對象實例,使他們組合成應用程序,但這些模式無非只是:最佳實踐賦予的一個名字,以及這是什麼樣的模式,應用於哪裏,它能解決的問題等等。 模式是您必須在應用程序中自己實現的形式化的最佳實踐。

Spring框架控制反轉(IOC)組件通過提供一系列的標準化的方法把完全不同的組件組合成一個能夠使用的應用程序來解決這個問題。Spring框架把形式化的設計模式編寫爲優秀的對象,你可以容易的集成到自己的應用程序中。許多組織和機構使用Spring框架,以這種方式(使用Spring的模式對象)來設計健壯的,可維護的應用程序。

背景

“ 現在的問題是,什麼方面的控制被(他們)反轉了? ”馬丁·福勒2004年在他的網站提出了這個有關控制反轉(IOC)的問題 ,福勒建議重命名,使之能夠自我描述,並提出了依賴注入( Dependency Injection)。

2.2模塊

Spring框架的功能被有組織的分散到約20個模塊中。這些模塊分佈在覈心容器,數據訪問/集成,Web,AOP(面向切面​​的編程),植入(Instrumentation),消息傳輸和測試,如下面的圖所示。

圖2.1 Spring框架概述

spring overview

以下部分列出了每個可用模塊,以及它們的工件名稱和它們支持的主要功能。工件的名字對應的是工件標識符,使用在依賴管理工具中。

2.2.1核心容器

核心容器由以下模塊組成,spring-core, spring-beans,spring-context,spring-context-support,和spring-expression (Spring表達式語言)。

spring-core和spring-beans模塊提供了框架的基礎功能,包括IOC和依賴注入功能。 BeanFactory是一個成熟的工廠模式的實現。你不再需要編程去實現單例模式,允許你把依賴關係的配置和描述從程序邏輯中解耦。

上下文(spring-context)模塊建立在由Core和Beans模塊提供的堅實的基礎上:它提供一個框架式的對象訪問方式,類似於一個JNDI註冊表。上下文模塊從Beans模塊繼承其功能,並添加支持國際化(使用,例如,資源集合),事件傳播,資源負載,並且透明創建上下文,例如,Servlet容器。Context模塊還支持Java EE的功能,如EJB,JMX和基本的遠程處理。ApplicationContext接口是Context模塊的焦點。 spring-context-support支持整合普通第三方庫到Spring應用程序上下文,特別是用於高速緩存(ehcache,JCache)和調度(CommonJ,Quartz)的支持。

spring-expression模塊提供了強大的表達式語言去支持查詢和操作運行時對象圖。這是對JSP 2.1規範中規定的統一表達式語言(unified EL)的擴展。該語言支持設置和獲取屬性值,屬性分配,方法調用,訪問數組,集合和索引器的內容,邏輯和算術運算,變量命名以及從Spring的IoC容器中以名稱檢索對象。 它還支持列表投影和選擇以及常見的列表聚合。

2.2.2 AOP和Instrumentation

spring-aop模塊提供了一個符合AOP聯盟(要求)的面向方面的編程實現,例如,允許您定義方法攔截器和切入點(pointcuts),以便乾淨地解耦應該被分離的功能實現。 使用源級元數據(source-level metadata)功能,您還可以以類似於.NET屬性的方式將行爲信息合併到代碼中。

單獨的spring-aspects模塊,提供了與AspectJ的集成。

spring-instrument模塊提供了類植入(instrumentation)支持和類加載器的實現,可以應用在特定的應用服務器中。該spring-instrument-tomcat 模塊包含了支持Tomcat的植入代理。

2.2.3消息

Spring框架4包括spring-messaging(消息傳遞模塊),其中包含來自Spring Integration的項目,例如,Message,MessageChannel,MessageHandler,和其他用來傳輸消息的基礎應用。該模塊還包括一組用於將消息映射到方法的註釋(annotations),類似於基於Spring MVC註釋的編程模型。

2.2.4數據訪問/集成

數據訪問/集成層由JDBC,ORM,OXM,JMS和事務模塊組成。

spring-jdbc模塊提供了一個JDBC –抽象層,消除了需要的繁瑣的JDBC編碼和數據庫廠商特有的錯誤代碼解析。

spring-tx模塊支持用於實現特殊接口和所有POJO(普通Java對象)的類的編程和聲明式事務 管理。

spring-orm模塊爲流行的對象關係映射(object-relational mapping )API提供集成層,包括JPA和Hibernate。使用spring-orm模塊,您可以將這些O / R映射框架與Spring提供的所有其他功能結合使用,例如前面提到的簡單聲明性事務管理功能。

spring-oxm模塊提供了一個支持對象/ XML映射實現的抽象層,如JAXB,Castor,JiBX和XStream。

spring-jms模塊(Java Messaging Service) 包含用於生產和消費消息的功能。自Spring Framework 4.1以來,它提供了與 spring-messaging模塊的集成。

2.2.5 Web

Web層由spring-web,spring-webmvc和spring-websocket 模塊組成。

spring-web模塊提供基本的面向Web的集成功能,例如多部分文件上傳功能,以及初始化一個使用了Servlet偵聽器和麪向Web的應用程序上下文的IoC容器。它還包含一個HTTP客戶端和Spring的遠程支持的Web相關部分。

spring-webmvc模塊(也稱爲Web-Servlet模塊)包含用於Web應用程序的Spring的模型-視圖-控制器(MVC)和REST Web Services實現。 Spring的MVC框架提供了領域模型代碼和Web表單之間的清晰分離,並與Spring Framework的所有其他功能集成。

2.2.6測試

spring-test模塊支持使用JUnit或TestNG對Spring組件進行單元測試和 集成測試。它提供了Spring ApplicationContexts的一致加載和這些上下文的緩存。它還提供可用於獨立測試代碼的模仿(mock)對象

2.3使用場景

之前描述的構建模塊使Spring成爲許多應用場景的理性選擇,從在資源受限設備上運行的嵌入式應用程序到使用Spring的事務管理功能和Web框架集成的全面的企業應用程序。

圖2.2 典型的成熟完整的Spring Web應用程序

overview full

Spring的聲明式事務管理功能使Web應用程序完全事務性,就像使用EJB容器管理的事務一樣。所有您的定製業務邏輯都可以使用簡單的POJO實現,並由Spring的IoC容器進行管理。附加服務包括支持發送電子郵件和獨立於Web層的驗證,可讓您選擇執行驗證規則的位置。 Spring的ORM支持與JPA和Hibernate集成;例如,當使用Hibernate時,可以繼續使用現有的映射文件和標準的Hibernate SessionFactory配置。表單控制器將Web層與域模型無縫集成,從而無需ActionForms或將HTTP參數轉換爲域模型的值的其他類。

圖2.3使用第三方web框架的Spring中間層

overview thirdparty web

有時情況不允許你完全切換到不同的框架。 Spring框架並不強制您使用其中的一切;這不是一個全有或全無的解決方案。使用Struts,Tapestry,JSF或其他UI框架構建的現有前端可以與基於Spring的中間層集成,從而允許您使用Spring事務功能。您只需要使用ApplicationContext連接您的業務邏輯,並使用WebApplicationContext來集成您的Web層。

圖2.4 遠程使用場景

overview remoting

當您需要通過Web服務訪問現有代碼時,你可以使用Spring的 Hessian-,Rmi-或HttpInvokerProxyFactoryBean類。啓用對現有應用程序的遠程訪問並不困難。

圖2.5  EJBs – 包裝現有的POJOs

overview ejb

Spring Framework還爲Enterprise JavaBeans提供了一個訪問和抽象層,使您能夠重用現有的POJO,並將其包裝在無狀態會話bean中,以便在可能需要聲明式安全性的, 可擴展的,故障安全的Web應用程序中使用。

2.3.1依賴管理和命名約定

依賴關係管理和依賴注入是不同的。爲了將Spring的這些不錯的功能(如依賴注入)集成到應用程序中,您需要組裝所有需要的庫(jar文件),並在運行時導入到類路徑(classpath)中,也有可能在編譯時就需要加入類路徑。這些依賴關係不是注入的虛擬組件,而是文件系統中的物理資源(通常是這樣)。依賴關係管理的過程包括定位這些資源,存儲它們並將其添加到類路徑中。依賴關係可以是直接的(例如,我的應用程序在運行時依賴於Spring)或間接的(例如我的應用程序依賴於commons-dbcp ,而commons-dbcp 又依賴於commons-pool)。間接依賴關係具有“傳遞性”,它們是最難識別和管理的依賴關係。

如果你要使用Spring,你需要獲得一個包含你所需要的Spring模塊的jar庫的副本。爲了使這更容易,Spring被打包爲一組儘可能分離依賴關係的模塊,例如,如果您不想編寫Web應用程序,則不需要spring-web模塊。要引用本指南中的Spring庫模塊,我們使用一個簡寫命名約定spring- *或spring – *.jar,其中*表示模塊的簡稱(例如spring-core,spring-webmvc,spring-jms等) )。您實際使用的jar文件名通常是與版本號連接的模塊名稱(例如spring-core-5.0.0.M5.jar)。

Spring框架的每個版本都會發布到以下幾個地方:

  • Maven Central,它是Maven查詢的默認存儲庫,不需要任何特殊配置。 Spring的許多常見的庫也可以從Maven Central獲得,Spring社區的大部分使用Maven進行依賴關係管理,所以這對他們來說很方便。這裏的jar的名字是spring – * – <version> .jar,Maven groupId是org.springframework。
  • 在專門用於Spring的公共Maven存儲庫中。除了最終的GA版本,該存儲庫還承載開發快照和里程碑版本。 jar文件名與Maven Central格式相同,因此這是一個有用的地方,可以將開發中的版本的Spring與在Maven Central中部署的其他庫配合使用。該存儲庫還包含集中分發的zip文件,其中包含所有Spring jar,捆綁在一起以便於下載。

所以你需要決定的第一件事是如何管理你的依賴關係:我們通常建議使用像Maven,Gradle或Ivy這樣的自動化系統,但你也可以通過自己下載所有的jar來手動執行。

您將在下面找到Spring artifacts列表。有關每個模塊的更完整的描述,第2.2節“模塊”.

表2.1  Spring框架的Artifacts

GroupId ArtifactId Description(描述)
org.springframework spring-aop Proxy-based AOP support
org.springframework spring-aspects AspectJ based aspects
org.springframework spring-beans Beans support, including Groovy
org.springframework spring-context Application context runtime, including scheduling and remoting abstractions
org.springframework spring-context-support Support classes for integrating common third-party libraries into a Spring application context
org.springframework spring-core Core utilities, used by many other Spring modules
org.springframework spring-expression Spring Expression Language (SpEL)
org.springframework spring-instrument Instrumentation agent for JVM bootstrapping
org.springframework spring-instrument-tomcat Instrumentation agent for Tomcat
org.springframework spring-jdbc JDBC support package, including DataSource setup and JDBC access support
org.springframework spring-jms JMS support package, including helper classes to send and receive JMS messages
org.springframework spring-messaging Support for messaging architectures and protocols
org.springframework spring-orm Object/Relational Mapping, including JPA and Hibernate support
org.springframework spring-oxm Object/XML Mapping
org.springframework spring-test Support for unit testing and integration testing Spring components
org.springframework spring-tx Transaction infrastructure, including DAO support and JCA integration
org.springframework spring-web Web support packages, including client and web remoting
org.springframework spring-webmvc REST Web Services and model-view-controller implementation for web applications
org.springframework spring-websocket WebSocket and SockJS implementations, including STOMP support

 

Spring的依賴和依賴於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>5.0.0.M5</version>
		<scope>runtime</scope>
	</dependency>
</dependencies>

(依賴配置)就是這樣。注意,如果您不需要針對Spring API進行編譯,那麼範圍(scope)可以被聲明爲運行時,通常情況下這是基本的依賴注入用例。

以上示例適用於Maven Central存儲庫。要使用Spring Maven倉庫(例如,使用里程碑或開發中的快照版本),您需要在Maven配置中指定倉庫位置。完整版本:

<repositories>
	<repository>
		<id>io.spring.repo.maven.release</id>
		<url>http://repo.spring.io/release/</url>
		<snapshots><enabled>false</enabled></snapshots>
	</repository>
</repositories>

對於里程碑(milestones):

<repositories>
	<repository>
		<id>io.spring.repo.maven.milestone</id>
		<url>http://repo.spring.io/milestone/</url>
		<snapshots><enabled>false</enabled></snapshots>
	</repository>
</repositories>

而對於快照(snapshots):

<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項目會傳遞依賴於舊版本的Spring JARs。如果您忘記自己明確聲明直接依賴,可能會出現各種意外問題。

爲了克服這些問題,Maven支持“材料清單(bill of materials)”(BOM)依賴的概念。您可以在dependencyManagement部分中導入spring-framework-bom,以確保所有Spring依賴(直接和傳遞)都是相同的版本

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-framework-bom</artifactId>
			<version>5.0.0.M5</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

使用BOM的另外一個好處是,您不再需要在依賴於Spring Framework artifacts時指定<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倉庫,請在倉庫部分中包含適當的URL:

repositories {
	mavenCentral()
	// and optionally...
	maven { url "http://repo.spring.io/release" }
}

您可以根據需要將repositoriesURL從/release更改爲/milestone或/snapshot。一旦repositories被配置,你可以通常使用Gradle方式來聲明依賴:

dependencies {
	compile("org.springframework:spring-context:5.0.0.M5")
	testCompile("org.springframework:spring-test:5.0.0.M5")
}

Ivy依賴管理

如果您喜歡使用 Ivy 來管理依賴關係,那麼還有類似的配置選項。 要配置Ivy指向Spring倉庫,請將以下解析器添加到您的ivysettings.xml中:

<resolvers>
	<ibiblio name="io.spring.repo.maven.release"
			m2compatible="true"
			root="http://repo.spring.io/release/"/>
</resolvers>

您可以更改root從URL /release/到/milestone/或/snapshot/適當。

配置完成後,您可以在通常的方式添加依賴。例如(在ivy.xml):

您可以根據需要將rootURL從 /release/更改爲/milestone/或/snapshot/。 配置完成後,您可以按通常的方式添加依賴項。例如(在ivy.xml中):

<dependency org="org.springframework"
	name="spring-core" rev="5.0.0.M5" conf="compile->runtime"/>

Zip文件發行

雖然使用依賴關係管理的構建系統是推薦的獲取Spring框架的方法,但仍然可以下載發佈的zip文件。

Zip文件發佈到Spring Maven存儲庫(這僅僅是爲了我們的方便,您不需要使用Maven或任何其他構建系統才能下載它們)。

要下載發佈的zip文件,打開Web瀏覽器到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應用程序可以快樂地把日誌輸出到控制檯,這很重要。

不使用Commons Logging

不幸的是,commons-logging中的運行時發現算法雖然對最終用戶很方便,但是也有很多問題。如果我們可以把時空倒回,現在開始使用Spring去開始一個新的項目,我們會使用不同的日誌依賴關係。第一選擇可能是Simple Logging Facade for Java(SLF4J),它也被許多其他使用Spring的應用工具所使用。

基本上有兩種方法來關閉commons-logging:

  1. 排除spring-core模塊的依賴關係(因爲它是明確依賴於commons-logging的唯一模塊)
  2. 依賴於一個特殊的commons-logging依賴關係,用空的jar代替庫(更多的細節可以在SLF4J FAQ中找到)

要排除commons-logging,請將以下內容添加到dependencyManagement部分:

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
		<version>5.0.0.M5</version>
		<exclusions>
			<exclusion>
				<groupId>commons-logging</groupId>
				<artifactId>commons-logging</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
</dependencies>

現在這個應用程序可能已經被破壞了,因爲在類路徑中沒有實現JCL API,所以要修復它,必須提供一個新的JCL API。在下一節中,我們向您展示如何使用SLF4J提供JCL的替代實現。

使用SLF4J

SLF4J是一個更清潔的依賴關係,在運行時比commons-logging更有效率,因爲它使用編譯時綁定,而不是其集成的其他日誌框架的運行時發現。這也意味着你必須更加明確地說明你在運行時想要發生什麼,並聲明它或相應地進行配置。 SLF4J提供對許多常見的日誌框架的綁定,因此通常可以選擇一個已經使用的日誌框架,並綁定到該框架進行配置和管理。

SLF4J提供了綁定到許多常見的日誌框架的方法,包括JCL,它也是可以反轉的:是其他日誌框架和自身(Spring)之間的橋樑。所以要使用SLF4J與Spring,您需要使用SLF4J-JCL bridge替換commons-logging依賴關係。一旦完成,那麼在Spring中日誌調用將被轉換爲對SLF4J API的日誌調用,因此如果應用程序中的其他庫使用該API,那麼您有一個統一的地方來配置和管理日誌記錄。

常見的選擇可能是將Spring鏈接到SLF4J,然後提供從SLF4J到Log4j的顯式綁定。您需要提供多個依賴關係(並排除現有的commons-logging):the bridge,Log4j的SLF4J實現和Log4j實現本身。在Maven你會這樣做:

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
		<version>5.0.0.M5</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.22</version>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-slf4j-impl</artifactId>
		<version>2.7</version>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-api</artifactId>
		<version>2.7</version>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-core</artifactId>
		<version>2.7</version>
	</dependency>
</dependencies>

這可能看起來像很多依賴只是爲了獲得一些日誌。是的,但它是可選的,它應該比具有類加載器問題的commons-logging更好,特別是如果你在一個要求嚴格的容器,如OSGi平臺。而且還有一個性能優勢,因爲綁定在編譯時不是運行時。

使用較少步驟並生成較少依賴關係的SLF4J用戶更爲常見的選擇是直接綁定到Logback。這將刪除額外的綁定步驟,因爲Logback直接實現SLF4J,因此您只需要依賴於兩個庫(jcl-over-slf4j和logback)而不是四個。如果這樣做,您可能還需要從其他外部依賴關係(不是Spring)中排除slf4j-api依賴關係,因爲您只需要在類路徑中使用該API的一個版本。

使用的Log4j

 [Note]
Log4j的1.x版本已經壽終正寢,以下的內容特指Log4j 2

許多人使用Log4j 作爲配置和管理日誌的日誌框架。它是高效和成熟的,當我們構建和測試Spring,實際上它是在運行時使用的。 Spring還提供了一些用於配置和初始化Log4j的實用功能,因此它在某些模塊中對Log4j具有可選的編譯時依賴性。

要使用JCL和Log4j,所有你需要做的就是把Log4j加到類路徑,併爲其提供一個配置文件(log4j2.xml,log4j2.properties或其他 支持的配置格式)。對於Maven用戶,所需的最少依賴關係是:

<dependencies>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-core</artifactId>
		<version>2.7</version>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-jcl</artifactId>
		<version>2.7</version>
	</dependency>
</dependencies>

如果你也想使用SLF4J,還需要以下依賴關係:

<dependencies>
  <dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-slf4j-impl</artifactId>
	<version>2.7</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>
運行時容器和原生JCL

許多人在那些本身提供JCL實現的容器中運行他們的Spring應用程序。IBM WebSphere應用服務器(WAS)爲例。這往往會導致問題,遺憾的是沒有一勞永逸的解決方案; 在大多數情況下,簡單地從您的應用程序排除commons-logging是不夠的。

要清楚這一點:報告的問題通常不是JCL本身,甚至commons-logging:而是將commons-logging綁定到另一個框架(通常是Log4j)。這可能會失敗,因爲commons-logging更改了在一些容器中發現的舊版本(1.0)和大多數人現在使用的版本(1.1)之間執行運行時發現的方式。 Spring不使用JCL API的任何不尋常的部分,所以沒有什麼破壞,但是一旦Spring或您的應用程序嘗試輸出日誌,您可以發現與Log4j的綁定不起作用

在這種情況下,使用WAS最簡單的方法是反轉類加載器層次結構(IBM將其稱爲”parent last”),以便應用程序控制JCL依賴關係,而不是容器。該選項並不總是開放的,但是在公共領域還有許多其他建議可供選擇,您的里程(集成程度)可能因容器的確切版本和功能集而異。


轉載地址:http://ifeve.com/overview-getting-started-with-spring/



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