2.3.1 依赖管理和命名规约
2.3.1 依赖管理和命名规约
依赖管理和依赖注入是不同的两件事。为使程序可以拥有Spring那些出色的功能(如依赖注入),您需要聚集所有需要的库(jar文件),并且在运行时,也可能是在编译时将它们放到类路径中。(通常)这些依赖不是被注入的虚拟组件,而是文件系统的物理资源。依赖管理的过程包括定位这些资源、存储它们并将它们添加到类路径中。依赖可以是直接的(例如我的程序在运行时依赖于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-4.2.3.RELEASE.jar)。
Spring Framework的每个发行版都会发布到以下几处:
- Maven中央仓库,默认的Maven查询仓库,并且不需要任何特殊的配置来使用。Spring依赖的很多常用库都能从Maven中央仓库获得,而且大部分Spring社区都用Maven做依赖管理,所以这对他们来说很方便。这里的jar文件名采用
spring-*-<version>.jar
的格式,Maven的groupId是org.springframework
。 - 专门为Spring办的一个公开的Maven仓库。除了最终的GA版本,该仓库还有开发快照版和里程碑版。jar文件名采用和Maven中央仓库一样的格式,所以,如果您想获取Spring的各个开发版和部署在Maven中央仓库的其他库一起使用,这个仓库还是很有用的。为了方便下载,仓库里还包含Spring的全部jar包归档在一起的zip文件。
所以,您需要决定的第一件事就是如何管理依赖:我们一般推荐使用像Maven、Gradle或Ivy这样的自动化系统,不过您也可以自己下载全部的jar包手动管理。
您会发现如下的Spring构件列表。有关每个模块的更完整描述,请参见2.2 框架模块。
Table 2.1. Spring Framework Artifacts
GroupId | ArtifactId | 描述 |
---|---|---|
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 | 被许多Spring其他模块使用的核心工具 |
org.springframework | spring-expression | Spring表达式语言(SpEL) |
org.springframework | spring-instrument | Instrumentation agent for JVM bootstrapping |
org.springframework | spring-instrument-tomcat | Instrumentation agent for 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 | 支持用于测试Spring组件的单元测试和集成测试 |
org.springframework | spring-tx | 事务基础结构,包括DAO支持和JCA集成 |
org.springframework | spring-web | Web支持包,包括客户端和Web远程 |
org.springframework | spring-webmvc | REST Web服务和针对Web应用的模型-视图-控制器实现 |
org.springframework | spring-webmvc-portlet | 在Portlet环境中使用的MVC实现 |
org.springframework | spring-websocket | WebSocket和SockJS实现,包括STOMP支持 |
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>4.3.12.RELEASE</version>
<scope>runtime</scope>
</dependency>
</dependencies>
仅此而已。请注意,如果不需要编译Spring API,可以把scope声明为runtime,这是基本依赖注入用例的典型情况。
上面的例子使用的是Maven中央仓库。要使用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>
对于里程碑版:
<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)这一概念。您可以在dependencyManagement
段中导入spring-framework-bom
来确保所有的Spring依赖(包括直接的和间接的)都是同一版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.3.12.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
使用BOM的另一个好处是,依赖Spring Framework的组件时不再需要指定<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.12.RELEASE")
testCompile("org.springframework:spring-test:4.3.12.RELEASE")
}
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
中):
<dependency org="org.springframework"
name="spring-core" rev="4.3.12.RELEASE" conf="compile->runtime"/>
发行的Zip文件
虽然使用一个支持依赖管理的构建系统是获取Spring Framework的推荐方式,但是仍然可以下载一个发行的zip文件。
发行的zip文件被发布到Spring的Maven仓库中(这仅仅是为了我们方便,您不需要Maven或任何其他构建系统来下载它们)。
要下载发行的zip文件,请打开Web浏览器访问http://repo.spring.io/release/org/springframework/spring,并根据想要的版本选择相应的子目录。发行文件以-dist.zip
结尾,例如spring-framework-{spring-version}-RELEASE-dist.zip。发行文件也有里程碑版和快照版。