2.3.1 依赖管理和命名规约

依赖管理和依赖注入是不同的两件事。为使程序可以拥有Spring那些出色的功能(如依赖注入),您需要聚集所有需要的库(jar文件),并且在运行时,也可能是在编译时将它们放到类路径中。(通常)这些依赖不是被注入的虚拟组件,而是文件系统的物理资源。依赖管理的过程包括定位这些资源、存储它们并将它们添加到类路径中。依赖可以是直接的(例如我的程序在运行时依赖于Spring),也可以是间接的(例如我的程序依赖于commons-dbcp,而commons-dbcp依赖于commons-pool)。间接依赖关系也被称为“传递性”,是最难识别和管理的依赖。

如果打算使用Spring,您需要一份组成您所需Spring的jar文件的拷贝。为方便起见,Spring被打包为一系列模块以尽可能地分离依赖,举例来说,如果不想写Web应用,就不需要spring-web模块。为了在本指南中提及Spring库的模块,我们使用一个简写的命名规约spring-*spring-*.jar,其中*代表模块的简称(例如spring-corespring-webmvcspring-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>

您可以根据需要将rootURL从/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。发行文件也有里程碑版快照版


书籍推荐