领先一步
VMware 提供培训和认证,助您加速进步。
了解更多我想我应该对 Java 和泛型相当熟悉,但最近我遇到了这段 Java 代码,它让我停下了脚步。
public abstract class AnnotationBasedPersistentProperty<P extends PersistentProperty<P>> extends AbstractPersistentProperty<P> {..}
这个类是 Spring Data 框架的 Repository 支持的内部组件,它消除了实现数据访问层时编写样板代码的需要,并为映射域对象和管理到任何类型持久存储的数据访问提供了通用的编程模型。Spring Data 当前的存储库实现包括关系数据库(JPA)、Gemfire、MongoDB 和 Neo4j。
幸运的是,如果你在 Java 应用程序中使用 Spring Data,你将永远不会看到这段代码。它隐藏在 Spring Data 简洁而强大的 Repository 抽象之后,提供了查询、分页、排序和常见的 CRUD 操作。例如:
public class SomeClient {
@Autowired
private PersonRepository repository;
public void doSomething() {
List<Person> persons = repository.findByLastname("Matthews");
}
}
正如 Spring Data 项目的使命宣言中所述:Spring Data 在提供 NoSQL 和关系型存储的熟悉且一致的基于 Spring 的编程模型的同时,保留了特定于存储的功能和能力。
当涉及到 repository 时,这个熟悉且一致的编程模型的一个关键特性是使用注解来配置持久化对象映射。这个想法最初是在 Hibernate 中实现的,随后被 JPA 所采纳。保留特定于存储的功能要求核心框架提供一些通用注解,例如 @Id 和 @Transient,同时也支持特定于存储的注解。
为了支持映射域对象的属性,Spring Data Repository 的实现应该继承 AnnotationBasedPersistentProperty。这个类提供了跨持久化存储的通用注解处理逻辑,并提供了用于特定存储的自定义注解处理的钩子。碰巧的是,这个类继承了另一个名为 AbstractPersistentProperty 的抽象类,声明如下:
public abstract class AbstractPersistentProperty<P extends PersistentProperty<P>> implements PersistentProperty<P>
public interface PersistentProperty<P extends PersistentProperty<P>>
PersistentEntity<?, P> getOwner(); PersistentEntity 是持久化域对象类的抽象表示。它旨在解决类级别的映射问题,并包含对——请注意——持久化属性的引用。PersistentEntity 被强类型化为扩展的 PersistentProperty 接口,并且还暴露了这里由通配符?形式参数表示的域类类型。所以让我们再看看最初的类型声明:
public abstract class AnnotationBasedPersistentProperty<P extends PersistentProperty<P>> extends AbstractPersistentProperty<P> {..}
public interface MongoPersistentProperty extends PersistentProperty<MongoPersistentProperty>{...}
public interface GemfirePersistentProperty extends PersistentProperty<GemfirePersistentProperty>{...}