领先一步
VMware 提供培训和认证,助您快速提升技能。
了解更多很高兴地宣布,我们已发布了各种 Spring Data 模块的 GA 版本。通过此版本,我们继续履行 SpringSource 的承诺,为 Java 开发人员提供使用最先进的持久化技术的工具。在这篇博文中,我想详细介绍此版本包含的内容、我们决定采用版本列车的原因以及 Spring Data 路线图的后续步骤。
我们一直在努力减少这些问题,但最终得出结论,更好地协调发布和同步模块的小版本发布是有意义的。现在通用的 Spring Data 版本包含以下参与者:
我们引入了@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 依赖项以强制使用旧版本。
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)。
@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 版本。
Spring Data Gemfire 模块还将与即将发布的 Gemfire 7.0 版本一起发布,以继续其简化使用数据网格开发 Java 应用程序的任务。
您只需在应用程序中注册RepositoryRestExporterServlet
,或者让您的 Spring MVC DispatcherServlet 配置包含RepositoryRestMvcConfiguration
JavaConfig 类即可。默认情况下,这将为应用程序上下文中的每个 Spring Data 存储库公开一个资源。可以通过遵循核心资源中公开的链接来发现这些资源。
假设您有两个存储库接口CustomerRepository
和ProductRepository
。您现在可以继续将以下设置代码添加到您的 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 书籍的相关章节(请参阅下面的更多信息)。
除了由 SpringSource 员工领导的存储实现模块之外,我们最近开始看到社区领导的实现出现。Neale Upstone 刚刚发布了FuzzyDB 模块的 1.0 版本,并且由 Christoph Strobl 领导的Spring Data Solr模块即将发布第一个里程碑版本。
如果您想在 Spring Data 模块中看到任何功能,或者对现有模块有任何反馈,现在是时候在Spring JIRA中发出您的声音了。