Spring Data 发布列车已抵达

工程 | Oliver Drotbohm | 2012 年 10 月 15 日 | ...

很高兴地宣布,我们刚刚发布了多个 Spring Data 模块的 GA 版本。通过本次发布,我们继续践行 SpringSource 的承诺,为 Java 开发者提供使用最先进持久化技术工具。在这篇博文中,我想详细介绍本次发布包含的内容、我们为何决定采用发布列车模式,并简要展望 Spring Data 路线图的后续步骤。

发布列车

回顾 Spring Data 模块的开发方式,发布周期通常由各个模块负责人管理。鉴于模块的进度和成熟度不同,这在尝试同时使用多个模块时造成了一些问题。特别是依赖 Spring Data Commons 的项目受到了这个问题的困扰。

我们一直在努力尽量减少这些问题,但最终得出的结论是,更有意义的是更好地协调发布并同步模块的次要版本。当前的 Spring Data 发布列车包含以下参与者:

  • Spring Data Commons 1.4
  • Spring Data JPA 1.2
  • Spring Data MongoDB 1.1
  • Spring Data Neo4j 2.1
  • Spring Data Gemfire 1.2
  • Spring Data REST exporters 1.0
未来,我们将继续同步后续次要版本的发布。尽管如此,模块仍然可以按照自己的进度进行 bug 修复版本发布。

本次发布包含什么

正如刚才概述的,本次发布的核心主题是跨项目的兼容性。除了这个偏向非功能性的主题之外,最重要的特性可能是对 Spring Data Repository 的 JavaConfig 支持。我们在 Spring Data Commons 中改进了 XML 命名空间并引入了注解支持,以允许基于 JavaConfig 的 Repository 集成到特定存储模块中。

我们引入了 @Enable(Jpa|Mongo|Neo4j|Gemfire)Repositories,它们与 XML 的 repositories 命名空间元素是 1:1 等价的。因此,之前版本中必须像这样配置(以 JPA 为例):


<jpa:repositories base-package="com.acme.repositories" />

现在可以使用 @EnableJpaRepositories 注解在 Spring JavaConfig 配置类中实现。

@EnableJpaRepositories(base-package = "com.acme.repositories")
class ApplicationConfig {

}

通过这种配置方式,我们实现了跨存储实现的完全无 XML 应用程序配置。更高级的注解配置用法示例可以在 Spring Data 团队成员编写的最近发布的 Spring Data 书籍的示例代码中找到。代码位于 GitHub,并使用了最新 Spring Data 版本以及最新 Spring 3.2 里程碑的所有新特性。请将此仓库视为未来 Spring Data 相关代码示例的规范示例仓库。

为了集成 Repository 的 @Enable… 注解,我们需要将 Spring 依赖版本提升到 3.1 系列。尽管如此,代码库的其余部分仍然完全兼容 Spring 3.0 分支。因此,本次发布中包含的模块默认都依赖于 Spring 3.1.2。如果您确实需要使用 3.0.7,请在项目的 pom.xml 中手动定义 Spring 依赖以强制使用旧版本。

JPA

除了对 Repository 的 JavaConfig 支持外,JPA 模块还包含大量细微但重要的改进,例如更新到最新版本的持久化提供者 (Hibernate 3.6.10, EclipseLink 2.4.0)。我们积极主动地确保与 Hibernate 4 分支的兼容性,但尚未升级我们的依赖版本,以避免强制用户升级或手动将项目配置降级到 Hibernate 3。

MongoDB

在本次发布的模块中,MongoDB 可能是包含最多面向用户的新特性的一个。我们改进了 GridFS 支持,现在您可以使用 GridFsTemplate 轻松地将文件存储到 MongoDB 或从 MongoDB 中检索文件(详情请参阅参考文档的这一部分)。
class MongoConfig extends AbstractMongoConfiguration {

  // …

  @Bean
  public GridFsTemplate gridFsTemplate() {
    return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
  }
}

class GridFsClient {

  public static void main(String… args) throws Exception {
    ApplicationContext context = new AnnotationConfigApplicationContext(MongoConfig.class);
    GridFsOperations operations = context.getBean(GridFsOperations.class);

    File file = new File("myfile.txt");
    operations.store(file.getInputStream(), "myfile.txt");

    GridFsResource[] txtFiles = operations.getResources("*.txt");
   }
}

如果您想在 JavaEE 6 环境中使用 Spring Data MongoDB,现在可以实现,因为我们提供了 CDI 扩展,允许使用 @Inject 将基于 MongoDB 的 Spring Data Repository 注入到 CDI 管理的 Bean 中 (DATAMONGO-356)。

除此之外,我们收到了 Maciej Walkowiak 和 Patryk Wasik 的两份社区贡献。Maciej 通过利用我们触发的持久化事件实现了对 JSR-303 验证的支持 (DATAMONGO-36)。Patryk 通过添加 @Version 注解以及对我们持久化机制的必要调整,实现了乐观锁机制,以便在文档被他人修改后抛出异常 (DATAMONGO-279)。

Neo4j

Spring Data Neo4j 最值得注意的改进是增加了对唯一实体创建的支持。您现在可以将实体字段标记为 @Indexed(unique=true),这将启用 Neo4j 创建唯一节点和实体的机制。

我们还投入了大量精力使关系处理更轻松、更全面,您现在可以像处理节点实体一样填充和保存关系实体。我们也允许更细粒度地控制关系类型。现在也可以在 @RelationshipEntity(type="REL_TYPE") 注解中设置,或者在带有 @RelationshipType 注解的字段中设置,以实现按实例使用。应大众需求,我们现在允许带有 @RelatedToVia 注解的字段受到目标字段类型的约束。

通过本次发布,图中类型层次结构的存储支持得到了改进,您可以使用 @TypeAlias("myType") 来节省属性和索引中的宝贵空间。别名类型的多态读取现在也按预期工作。

对于审计、验证和其他横切关注点来说,新的生命周期事件是一个有用的补充。与其他模块一样,ApplicationContextListener 现在可以监听 (Before|After)SaveEvent。我们还重构了内部基础设施,现在您可以直接围绕 GraphDatabaseService 创建 Neo4jTemplate,甚至无需设置应用程序上下文。

我们投入了大量精力的一件事是改进用户自定义或 finder 方法派生的 cypher 查询的处理。这也是 Spring Data Neo4j 模块未来将投入大量精力关注的领域。Spring Data Neo4j 的 2.1 版本支持最近发布的 Neo4j 1.8 版本,并且也兼容 1.7 版本。

Gemfire

Gemfire 模块的发布包含了一个更高级的 Spring 命名空间,以更紧密地模仿 Gemfire 缓存配置选项,从而完善基于 Spring 的编程模型。它还提供了一个 Spring Data Repository 抽象的实现,就像您习惯于使用其他存储一样,可以轻松访问实体和执行查询。

Spring Data Gemfire 模块也将与即将发布的 Gemfire 7.0 版本一同发布,以继续简化使用数据网格开发 Java 应用程序的任务。

REST 导出器

Spring Data 项目组合中另一个重要的新增功能是 REST 导出器。它允许以超媒体驱动的方式通过 HTTP 暴露由 Spring Data Repository 管理的实体,并允许触发定义在查询方法中的执行。

您只需在应用程序中注册 RepositoryRestExporterServlet,或者让您的 Spring MVC DispatcherServlet 配置包含 RepositoryRestMvcConfiguration JavaConfig 类。默认情况下,这将在应用程序上下文中为每个 Spring Data Repository 公开一个资源。这些资源可以通过核心资源中公开的链接进行发现。

假设您有两个 Repository 接口 CustomerRepositoryProductRepository。您现在可以在 Servlet 3 WebApplicationInitializer 中添加以下设置代码:

DispatcherServlet servlet = new RepositoryRestExporterServlet();
Dynamic dispatcher = container.addServlet("dispatcher", servlet);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");

例如,在 Jetty 中运行应用程序将得到以下结果:

$ curl -v http://localhost:8080

{ "links" : [ {
    "rel" : "product",
    "href" : "http://localhost:8080/product"
  }, {
    "rel" : "customer",
    "href" : "http://localhost:8080/customer"
}]}

客户端现在可以跟踪这些链接来访问产品和客户,探索它们与其他实体之间的关系(反过来也是超媒体驱动的),并执行在 Repository 接口中通过查询方法声明的查询。目前,仅支持基于 JPA 的 Repository,但我们将在后续版本中添加对所有其他存储的支持。

有详细的选项可以配置公开哪些资源和哪些 HTTP 方法,还有扩展点可以通过自定义链接来操作返回的表示,以丰富您的 API,使其超越纯粹的 CRUD 操作。要了解有关该项目的更多信息,请查看其参考文档或我们与 O'Reilly 合著的 Spring Data 书籍的相关章节(下文会介绍更多)。

路线图

本次发布完成了 Spring Data Commons 1.x 分支的开发,所有随本次发布一同发布的存储实现都依赖于此。接下来,我们将专注于 2.0 版本的第一个里程碑,以实现更高级的功能,并稍微修改一些核心内容,这可能需要 API 更改和对编程模型的调整。这包括一个通用的审计机制(目前仅在 JPA 模块中可用)以及基于接口的 Repository 抽象的更大灵活性。

除了由 SpringSource 员工主导的存储实现模块之外,我们最近开始看到社区主导的实现出现。Neale Upstone 刚刚发布了 FuzzyDB 模块的 1.0 版本,而 Christoph Strobl 主导的 Spring Data Solr 模块也即将发布第一个里程碑。

如果您希望在 Spring Data 模块中看到任何功能,或者对现有功能有任何反馈,现在是在 Spring JIRA 中提出意见的时候了。

其他

最后我想向您介绍的是 STS 中对 Spring Data 的支持,该支持已在 3.0 版本中引入。编辑 Spring Data Repository 时,您将获得实时的查询方法验证,如下所示:

查询方法验证

除此之外,您在编写查询方法时还可以获得代码补全支持。

查询方法的代码补全支持

如果这篇博文是您第一次接触 Spring Data 项目,或者您想开始使用该项目,我强烈建议您看看我们编写的 O'Reilly Spring Data 书籍。它是关于最先进的 Java 持久化、Spring Data 项目及其核心设计原则的实用介绍。它通过实际示例和随书提供的示例代码的详细解释,介绍了特定于存储的模块。刚刚开始的 SpringOne2GX 大会的参会者将获得本书 PDF 版本的免费副本。

总结

在 8 个月的开发时间里,我们修复了将近 300 张工单。特别感谢 Michael Hunger 和来自 Neo Technologies 的 Lasse Westh-Nielssen 在 Neo4j 模块上的推动,David Turanski 和 Costin Leau 在 Spring Data Gemfire 模块上的工作,Jon Brisbin 对 REST exporter 模块的领导,Mark Pollack 作为项目总负责人,以及所有其他 Spring Data 团队成员的支持。特别感谢 Spring Data 社区中的每个人通过 JIRA 和论坛提供的宝贵反馈,以及他们在 GitHub 上的拉取请求,这帮助我们在此次发布中引入了更多功能。

获取 Spring 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获取支持

Tanzu Spring 通过一个简单的订阅,为您提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部