抢占先机
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 的编程模型,同时保留了特定于存储的功能和特性。
当涉及到存储库时,这个熟悉且一致的编程模型的关键特性是使用注解来配置持久对象映射。这个想法首先在 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 是持久化域对象的类的抽象表示。它旨在解决类级别的映射问题,并包含对 - 等等 - Persistent 属性的引用。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>{...}