创建 Repository 实例
本节介绍如何为已定义的 Repository 接口创建实例和 Bean 定义。
Java 配置
在 Java 配置类上使用 store 特定的 @EnableKeyValueRepositories 注解,以定义用于激活 repository 的配置。有关基于 Java 配置 Spring 容器的介绍,请参阅 Spring 参考文档中的 JavaConfig。
启用 Spring Data repositories 的示例配置如下所示:
@Configuration
@EnableJpaRepositories("com.acme.repositories")
class ApplicationConfiguration {
@Bean
EntityManagerFactory entityManagerFactory() {
// …
}
}
前面的示例使用了 JPA 特有的注解,你需要根据实际使用的 store 模块更改它。EntityManagerFactory bean 的定义也是如此。请参阅涵盖 store 特定配置的章节。
属性占位符与 Ant 风格模式
@EnableKeyValueRepositories 中的 basePackages 和 value 属性支持 ${…} 属性占位符(这些占位符会基于 Environment 进行解析),同时也支持诸如 "org.example.**" 的 Ant 风格包模式。
以下示例为 @EnableKeyValueRepositories 中隐式 value 属性指定了 app.scan.packages 属性占位符。
- Java
- Kotlin
@Configuration
@EnableKeyValueRepositories("${app.scan.packages}") 1
public class ApplicationConfiguration {
// …
}
app.scan.packages属性占位符,将由Environment解析
@EnableKeyValueRepositories(["\${app.scan.packages}"]) 1
class ApplicationConfiguration {
// …
}
app.scan.packages属性占位符,将由Environment解析
XML 配置
每个 Spring Data 模块都包含一个 repositories 元素,它允许你定义 Spring 为你扫描的基础包,如下例所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa
https://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<jpa:repositories base-package="com.acme.repositories" />
</beans:beans>
在前面的示例中,Spring 被指示扫描 com.acme.repositories 及其所有子包,以查找扩展 Repository 或其任一子接口的接口。对于找到的每个接口,基础架构会注册与持久化技术相关的 FactoryBean,以创建适当的代理来处理查询方法的调用。每个 bean 都会根据接口名称派生出的 bean 名称进行注册,因此 UserRepository 接口将在 userRepository 下注册。嵌套仓库接口的 bean 名称会以其外部类型名称作为前缀。base package 属性允许使用通配符,因此你可以定义扫描包的模式。
使用筛选器
默认情况下,基础架构会拾取配置的基础包下所有扩展特定于持久化技术的 Repository 子接口,并为这些接口创建 bean 实例。不过,你可能希望对哪些接口创建 bean 实例进行更细粒度的控制。为此,可以在 repository 声明中使用 filter 元素。其语义与 Spring 的组件过滤器中的元素完全等效。有关详细信息,请参阅这些元素的 Spring reference documentation。
例如,若要将某些接口排除在作为 repository beans 实例化之外,可以使用以下配置:
- Java
- XML
@Configuration
@EnableKeyValueRepositories(basePackages = "com.acme.repositories",
includeFilters = { @Filter(type = FilterType.REGEX, pattern = ".*SomeRepository") },
excludeFilters = { @Filter(type = FilterType.REGEX, pattern = ".*SomeOtherRepository") })
class ApplicationConfiguration {
@Bean
EntityManagerFactory entityManagerFactory() {
// …
}
}
<repositories base-package="com.acme.repositories">
<context:include-filter type="regex" expression=".*SomeRepository" />
<context:exclude-filter type="regex" expression=".*SomeOtherRepository" />
</repositories>
前面的示例包含了所有以 SomeRepository 结尾的接口,并排除了以 SomeOtherRepository 结尾的接口被实例化。
独立使用
你也可以在 Spring 容器之外使用仓储基础设施 — 例如,在 CDI 环境中。你仍然需要在 classpath 中放置一些 Spring 库,但通常也可以通过编程方式设置仓储。提供仓储支持的 Spring Data 模块会附带特定于持久化技术的 RepositoryFactory,你可以按如下方式使用:
RepositoryFactorySupport factory = … // Instantiate factory here
UserRepository repository = factory.getRepository(UserRepository.class);