依賴管理(Dependency Management)和命名規范(Naming Conventions)
依賴管理和依賴注入(dependency injection)是有區別的。為了將Spring的優秀特性(如依賴注入)帶到你的應用中,需要在編譯時或運行時部署所需要的庫(jar包)。這些依賴不是虛擬的構件,而是文件系統上的物理資源。依賴管理的過程涉及到定位這些資源、存儲資源、加入classpath。依賴可以是直接的(例如Spring運行時),也可以是間接的(例如commons-dbcp)。間接的依賴(也可以說是transitive)很難標識和管理。
如果你要使用Spring,首先需要拷貝相應的jar包。為了方便使用,Spring將不同的依賴按模塊進行了封裝,例如,如果你正在開發的是一個非web應用,可以不必引用sping-web模塊。可以通過命名規范spring-* 或 spring-*.jar引用sping庫。*表示模塊的簡稱(例如spring-core,spring-webmvc,spring-jms)。實際的jar包后面一般會有版本串號(例如spring-core-4.1.1.RELEASE.jar)。
對於依賴的管理,建議使用Maven,Gradle 或 Ivy管理,當然jar包還是需要手動自己下載的。
Spring依賴
雖然Spring為大范圍的企業應用和外部工具提供了集成和支持,但強制依賴很少(例如,沒必要為了開發一個簡單的Spirng用例,而去定位和下載大量的jar包)。在其中的依賴注入中,只有一個外部依賴是強制的,即日志(log)。
接下來將會概述Spring的配置步驟。不管在什么場景下,如有不清楚的問題,請參考依賴管理文檔,或者查看Spring樣例代碼。Spring本身是使用Gradle來管理依賴,但后文將會使用Gradle或者Maven。
1.Maven依賴管理
如果你使用Maven進行依賴管理,不需要顯式提供日志依賴。例如,如果要創建應用上下文(context),則Maven的依賴注入配置如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.1.RELEASE</version>
<scope>runtime</scope>
</dependency>
</dependencies>
需要注意的是,如果不想與Spring API一起編譯,則scopes可以聲明為runtime。
使用Spring Maven資源還需要在配置文件中指定資源位置。
<repositories>
<repository>
<id>io.spring.repo.maven.release</id>
<url>http://repo.spring.io/release/</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
1.1 Bill Of Materials
有時我們會在不經意間引用不同版本的jar包。例如,有時從第三方或其它項目導入不同版本的jar包,如果不顯式聲明你的直接依賴,可能會產生很多詭異的問題。
為了解決此問題,Maven支持BOM(bill of materials)的概念。可以在dependencyManagement里面導入spring-framework-bom,以確保所有的依賴(包括直接的和間接的)引用的都是同一版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
使用BOM的另一好處是不用指定版本號。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependencies>