Spring Data 引入了一个 Repository Query Method 机制。使用者只需要定义一个接口,按照一定的格式声明方法,即可实现一定的查询功能。
例如:
interface PersonRepository extends Repository<Person, Long> {
List<Person> findByLastname(String lastname);
}
除了 JPA,Mongo 也支持这种用法。下面以 Spring Data Mongo 为例,简单解释一下其中涉及到的源代码。
Repository 查询方法的解析是在 MongoRepositoryFactory
的 RepositoryQuery resolveQuery(Method, RepositoryMetadata, NamedQueries)
方法中实现的。这个方法会将 Repository 接口中定义的查询方法做解析,解析为 RepositoryQuery
类型的一个对象。这里用到了策略模式,根据不同的配置,使用如 JPA、MongoDB 等不同的策略解析查询方法。MongoDB 对应的策略是 MongoQueryLookupStrategy
。解析完成之后,相应的 RepositoryQuery
会存储在 RepositoryFactorySupport
中的一个 ConcurrentHashMap
中,key 为查询方法名。然后通过 AOP 拦截响应的方法调用。然后在 AbstractMongoQuery
中的 execute
方法中做具体的查询动作。
里面用到的技术并复杂,其实就是反射、正则表达式、AOP 这些技术。