领先一步
VMware 提供培训和认证,助您快速发展。
了解更多随着我们开发的 Spring Data 发布列车临近终点,我想是时候简要概述一下本次发布将引入的一些新特性了。
如果您还不知道,发布列车是多个 Spring Data 模块的协调发布,旨在确保它们开箱即用无缝协作。当前的发布列车以关系模型的发明者 Edgar F. Codd 命名。
作为发布列车中所有其他模块的基础,Spring Data Commons 模块中的新特性也可用于各个存储模块。
对于 Codd 版本,我们将所需的最低 Spring 版本提高到 3.2.7,并改进了与 Spring 4.0 的兼容性,以便在更新到迄今为止最新最好的 Spring 版本时提供无缝体验。当您使用 Spring 4 和 Java 8 运行应用程序时,Spring Data 审计功能现在能够使用 JSR-310 类型填充实体的创建和修改日期。
abstract class BaseEntity {
@CreatedDate ZonedDateTime createdDate;
@LastModifiedDate ZonedDateTime modifiedDate;
}
此外,现在通常可以使用模块特定的 @Enable…Auditing
注解激活审计功能(更多内容请参阅 Thomas Darimont 关于第一个里程碑中引入的新特性的博客文章)。
从 Codd 开始,Spring Data repository 将被立即实例化,以确保 repository 接口的验证被立即触发,即使在容器启动时没有显式请求 repository 实例的注入点。要回退到旧行为,请在 repository 接口上使用 @Lazy
注解,就像您习惯于使用其他 Spring bean 定义一样。
在 Spring MVC 的 Web 支持领域,Spring Data 的 PagedResourcesAssembler
现在会创建符合 RFC-6570 标准的页面导航链接。因此,假设您有一个像这样的 Spring MVC 控制器
@Controller
class OrderController {
@RequestMapping("/orders")
HttpEntity<PagedResources<Resource<Order>>> showOrders(Pageable pageable,
PagedResourcesAssembler<Order> assembler) {
Page<Order> orders = orderRepository.findAll(pageable);
return new ResponseEntity<>(assembler.toResource(orders), HttpStatus.OK);
}
}
PagedResourcesAssembler
将检查给定的 Page
类型的 Order
集合,渲染内容、页面元信息,并酌情添加 prev
和 next
链接。
GET /orders?page=0&size=10
Accept: application/hal+json
200 OK
{ _links : { self : { href : "/orders{?page,size,sort}",
templated : true },
next : { href : "/orders?page=1&size=10" }},
_embedded : { orders : [ … ] },
page : {
size : 1,
totalElements : 2,
totalPages : 2,
number : 0
}
}
如您所见,self
链接清楚地表明了资源接受哪些参数来自定义响应。next
链接提供了访问与当前给定参数对应的下一页的方式。
最后,Commons 模块在配置评估方式上进行了重大改进,这将显著缩短启动时间,尤其是在拥有大量 repository 的应用程序中。
Spring Data JPA 模块主要进行了内部改进,并在与 JPA 和 CDI 交互方面增加了新特性:我们升级到 EclipseLink 2.5.1 并改进了与 Hibernate 4.3 的兼容性,以确保我们的用户可以使用基于 JPA 2.1 的持久化提供程序。
一个被反复请求的功能也进入了这个版本:在设计应用程序组件时,将 EntityManager
实例注入到构造函数中的能力。如果您编写需要访问 JPA EntityManager
的类,通常使用 @PersistenceContext
来触发它的注入。然而,我们通常认为构造函数注入是最佳实践,原因多种多样,因此无需对 EntityManager
回退到字段注入将非常有用。
不幸的是,@PersistenceContext
注解目前不能用于构造函数参数。我已为此在 JPA bug tracker 中提交了一个工单,但我们肯定不必等到 JPA 2.2 发布才能看到这个功能。从 Spring Data JPA 1.5 版本开始,您将能够像这样编写应用程序组件
class UserRepositoryImpl implements UserRepositoryCustom {
private final EntityManager em;
@Autowired // or @Inject
public UserRepositoryImpl(EntityManager em) {
this.em = em;
}
…
}
默认情况下,我们将注入由您的 ApplicationContext
中声明的 EntityManagerFactoryBean
创建的 EntityManager
实例。如果您定义了多个,可以使用 @Qualifier
指向您希望从中获取 EntityManager
的 EntityManagerFactoryBean
的 bean 名称。
在 Spring 容器中使用 Spring Data repository 时,repository 会被立即实例化。甚至在 Codd 之前,它们也会在客户端组件通过注入点请求 repository 时立即实例化。因此,无论何时将 repository 注入到客户端中,您都可以确保获得一个完全初始化的应用程序组件,这正是 Spring 组件模型所保证的。
然而,在 CDI 世界中,情况略有不同。当您访问应用程序组件时,无法保证其依赖项已初始化,因为在 CDI 组件模型中,仅注入一个代理并在首次使用时触发实际实例创建是允许的。
实际上,这可能导致 Spring Data repository 在您的应用程序代码正在运行 JPA 事务时被实例化。repository 实例化的一部分是检查支持查询方法的 JPA 命名查询。根据 JPA 规范,此类命名查询不存在(这在 Spring Data 环境中是完全正常的状态)必须通过抛出异常来表示,并且根据定义,此异常必须在 JPA 中触发事务回滚。
这意味着在 CDI 中将应用程序组件初始化与正在运行的业务代码混合在一起,您可能会在前者被调用时破坏后者。不幸的是,在 CDI 中没有开箱即用的方法可以强制应用程序组件立即实例化。有一些特定于容器的方法,但没有一个可以在所有容器上可靠地工作(如果您找到了,我会非常感兴趣)。
在 Spring Data JPA 1.5 中,我们将提供一个 @Eager
注解,它将使我们的 CDI 扩展触发 repository 的实例化,从而避免应用程序组件创建与业务代码执行之间的重叠。
Spring Data REST 的核心变更在于模块的映射配置和自定义部分的重大重构。这还包括我们为单个资源暴露的默认关系类型的更改。
对于每个 repository,Spring Data REST 都暴露了一个遵循集合资源模式的专用 REST 资源。这意味着我们有一个专门用于实体集合的资源,以及集合中每个项目的单独资源。
由于规范的 REST 客户端不应该自行创建与之交互的 URI,而是应该使用超媒体来遵循服务器提供的链接,我们需要暴露两种不同的关系类型来指示集合资源和项目资源之间的区别。
从 Spring Data REST 2.0 开始,项目资源的关系类型派生自 repository 管理的域类的名称。集合资源的关系类型然后通过使用 Evo Inflector 库将项目资源关系类型复数化来派生。因此,对于管理 Order
实例的 repository,您将看到名为 orders
指向集合资源和名为 order
指向项目资源的链接。
关系类型的这一变化对于基于 Spring Data REST 1.x 服务的超媒体客户端来说是突破性的改变,这是模块版本提高到 2.0 的主要原因之一。另一方面,随着模块 M1 版本的发布,我们已将 HAL 作为 Spring Data REST 暴露的默认媒体类型。我们正在研究对其他超媒体格式的支持,例如 Collection+JSON 等,但 HAL 似乎获得了相当多的关注。亚马逊最近发布了他们的 AppStream REST API,并使用 HAL 作为表示格式。
Spring Data Neo4j 模块中最大的变化(以及因此版本号变为 3.0 的原因)是对 Neo4j 2.0 的支持。因此,为了从该版本的最新和最佳特性中获益,请务必尝试 Codd 发布候选版。
在 MongoDB 方面,最重要的一个新特性是在聚合框架中支持 Spring Expression language。如果您错过了,Spring Data 工程师 Thomas Darimont 在他详细的博客文章中介绍了我们在 Codd M1 中已发布的所有特性。
如上所述,当然,Codd 中引入的 Spring Data Commons 的所有新特性也都会体现在 Neo4j 和 MongoDB 模块中。
GA 版本计划于 2014 年 2 月底发布。我们在 Spring Data Commons wiki 中有一个精心整理的变更日志,列出了本次发布中引入的所有重要特性。
我们非常感谢任何发布前测试以及在我们的 JIRA 实例中报告发现的潜在问题。