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 导出器 1.0
展望未来,我们将继续同步即将发布的小版本的发布。但是,模块可以按照自己的节奏发布错误修复版本。

此版本包含的内容

如上所述,此版本的核心主题是跨项目兼容性。除了这个相当非功能性的主题之外,最重要的功能可能是 Spring Data 存储库的 JavaConfig 支持。我们改进了 XML 命名空间并在 Spring Data Commons 中引入了注解支持,以允许集成基于 JavaConfig 的特定存储模块的存储库。

我们引入了@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 相关代码示例的规范示例存储库。

集成存储库的@Enable…注解要求我们将 Spring 依赖项提升到 3.1 版本。但是,其余代码库与 Spring 3.0 分支完全兼容。因此,此版本附带的模块默认依赖于 Spring 3.1.2。如果您确实需要使用 3.0.7,请在项目的pom.xml中手动定义 Spring 依赖项以强制使用旧版本。

JPA

除了存储库的 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 存储库注入到 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,即使没有设置应用程序上下文。

我们投入了大量精力改进的是对用户定义的或查找方法导出的 Cypher 查询的处理。这也是 Spring Data Neo4j 模块未来将投入大量投资的领域。Spring Data Neo4j 的 2.1 版本支持最近发布的 Neo4j 1.8 版本,也支持 1.7 版本。

Gemfire

Gemfire 模块的此版本包括一个更高级的 Spring 命名空间,以更紧密地模仿 Gemfire 缓存配置选项,从而完成基于 Spring 的编程模型。它还提供 Spring Data 存储库抽象的实现,以便像使用其他存储一样轻松访问和执行实体查询。

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

REST 导出器

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

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

假设您有两个存储库接口CustomerRepositoryProductRepository。您现在可以继续将以下设置代码添加到您的 Servlet 3 WebApplicationInitializer中:

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

例如,在 Jetty 中运行应用程序将为您提供:

$ curl -v https://127.0.0.1:8080

{ "links" : [ {
    "rel" : "product",
    "href" : "https://127.0.0.1:8080/product"
  }, {
    "rel" : "customer",
    "href" : "https://127.0.0.1:8080/customer"
}]}

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

有许多详细的选项可以配置哪些资源和哪些 HTTP 方法会被公开,扩展点可以用来操作返回的表示形式,并使用自定义链接来丰富您的 API,使其超越简单的 CRUD 操作。要了解更多关于该项目的信息,请查看其参考文档或我们与 O'Reilly 共同编写的 Spring Data 书籍的相关章节(请参阅下面的更多信息)。

路线图

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

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

如果您想在 Spring Data 模块中看到任何功能,或者对现有模块有任何反馈,现在是时候在Spring JIRA中发出您的声音了。

其他

最后一点我想提请您注意的是,STS 中的 Spring Data 支持已在 3.0 版本中引入。当编辑 Spring Data 存储库时,您现在可以在适当的位置获得查询方法验证,如下所示。

查询方法验证

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

查询方法的代码完成支持

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

摘要

在 8 个月的开发时间里,我们修复了近 300 个工单。特别感谢 Neo Technologies 的 Michael Hunger 和 Lasse Westh-Nielssen 推动 Neo4j 模块的开发;感谢 David Turanski 和 Costin Leau 在 Spring Data Gemfire 模块上的工作;感谢 Jon Brisbin 领导 REST 导出器模块的开发;感谢 Mark Pollack 作为项目的总体负责人,以及所有其他 Spring Data 团队成员的支持。特别感谢 Spring Data 社区的所有成员,感谢他们通过 JIRA 和论坛提供的极其宝贵的反馈,以及他们在 GitHub 上提交的 pull request,这些都帮助我们在发布版本中添加了更多功能。

获取 Spring Newsletter

关注 Spring Newsletter

订阅

领先一步

VMware 提供培训和认证,助您快速提升技能。

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部