领先一步
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 相关代码示例的规范示例仓库。
为了集成 Repository 的 @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 Repository 注入到 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
,甚至无需设置应用程序上下文。
我们投入了大量精力的一件事是改进用户自定义或 finder 方法派生的 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 Repository 公开一个资源。这些资源可以通过核心资源中公开的链接进行发现。
假设您有两个 Repository 接口 CustomerRepository
和 ProductRepository
。您现在可以在 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 书籍的相关章节(下文会介绍更多)。
除了由 SpringSource 员工主导的存储实现模块之外,我们最近开始看到社区主导的实现出现。Neale Upstone 刚刚发布了 FuzzyDB 模块的 1.0 版本,而 Christoph Strobl 主导的 Spring Data Solr 模块也即将发布第一个里程碑。
如果您希望在 Spring Data 模块中看到任何功能,或者对现有功能有任何反馈,现在是在 Spring JIRA 中提出意见的时候了。
查询方法验证
查询方法的代码补全支持