创建仓储实例
本章节介绍如何为已定义的 repository interfaces 创建实例和 bean definitions。
Java 配置
在 Java 配置类上使用特定于 store 的 @EnableLdapRepositories 注解,以定义用于 repository 激活的配置。对于 Spring 容器的基于 Java 的配置介绍,请参阅 JavaConfig in the Spring reference documentation。
启用 Spring Data 存储库的示例配置如下所示:
@Configuration
@EnableJpaRepositories("com.acme.repositories")
class ApplicationConfiguration {
@Bean
EntityManagerFactory entityManagerFactory() {
// …
}
}
前面的示例使用了 JPA 特定注解,需要根据实际使用的 store module 进行修改。EntityManagerFactory bean 的定义也是如此。请参阅涵盖 store-specific configuration 的章节。
属性占位符与 Ant-style Patterns
@EnableLdapRepositories 中的 basePackages 和 value 属性支持 ${…} 属性占位符,这些占位符会基于 Environment 解析,同时也支持 Ant 风格的包模式,例如 "org.example.**"。
下面的示例为 @EnableLdapRepositories 中隐式 value 属性指定了 app.scan.packages 属性占位符。
- Java
- Kotlin
@Configuration
@EnableLdapRepositories("${app.scan.packages}") 1
public class ApplicationConfiguration {
// …
}
app.scan.packages属性占位符,需在Environment中解析
@EnableLdapRepositories(["\${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 的 component filters 中的元素完全等价。有关这些元素的详细信息,请参阅 Spring reference documentation。
例如,若要将某些接口排除在 repository beans 实例化之外,可以使用以下配置:
- Java
- XML
@Configuration
@EnableLdapRepositories(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 容器之外使用 repository 基础设施 — 例如,在 CDI 环境中。你仍然需要在 classpath 中有一些 Spring 库,但通常你也可以以编程方式设置 repository。提供 repository 支持的 Spring Data 模块附带了一个与特定持久化技术相关的 RepositoryFactory,你可以按如下方式使用:
RepositoryFactorySupport factory = … // Instantiate factory here
UserRepository repository = factory.getRepository(UserRepository.class);