閱讀18 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Spring 5 官方文檔》1. Spring入門指南(二)

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>https://repo.spring.io/release/</url>
		<snapshots><enabled>false</enabled></snapshots>
	</repository>
</repositories>

對於裏程碑(milestones):

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

而對於快照(snapshots):

<repositories>
	<repository>
		<id>io.spring.repo.maven.snapshot</id>
		<url>https://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 "https://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="https://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瀏覽器到https://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依賴關係,而不是容器。該選項並不總是開放的,但是在公共領域還有許多其他建議可供選擇,您的裏程(集成程度)可能因容器的確切版本和功能集而異。

轉載自 並發編程網 - ifeve.com

最後更新:2017-05-18 11:01:44

  上一篇:go  Ruby 1.9概要(1)新的語法和語義
  下一篇:go  阻塞隊列的性能對比