建立 Repository 例項
本節介紹如何為定義的 repository 介面建立例項和 bean 定義。
Java 配置
使用特定於儲存的 @EnableKeyValueRepositories
註解在 Java 配置類上定義用於啟用 repository 的配置。有關 Spring 容器基於 Java 的配置介紹,請參見 Spring 參考文件中的 JavaConfig。
啟用 Spring Data repository 的示例配置如下所示:
@Configuration
@EnableJpaRepositories("com.acme.repositories")
class ApplicationConfiguration {
@Bean
EntityManagerFactory entityManagerFactory() {
// …
}
}
上面的示例使用 JPA 特定的註解,您需要根據實際使用的儲存模組進行更改。同樣適用於 EntityManagerFactory bean 的定義。請參閱介紹特定於儲存的配置的部分。 |
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
。巢狀 repository 介面的 bean 名稱會加上其封閉型別的名稱作為字首。base package 屬性允許使用萬用字元,以便您可以定義掃描包的模式。
使用過濾器
預設情況下,基礎設施會拾取配置的基礎包下所有繼承自持久化技術特定的 Repository
子介面的介面,併為其建立 bean 例項。但是,您可能希望更細粒度地控制哪些介面建立 bean 例項。為此,請在 repository 宣告內部使用 filter 元素。其語義與 Spring 元件過濾器中的元素完全等價。有關詳細資訊,請參閱 Spring 參考文件中關於這些元素的部分。
例如,要排除某些介面不作為 repository bean 例項化,您可以使用以下配置:
-
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 容器外部使用 repository 基礎設施,例如在 CDI 環境中。您仍然需要 classpath 中包含一些 Spring 庫,但通常您也可以透過程式設計方式設定 repository。提供 repository 支援的 Spring Data 模組自帶一個特定於持久化技術的 RepositoryFactory
,您可以如下使用:
RepositoryFactorySupport factory = … // Instantiate factory here
UserRepository repository = factory.getRepository(UserRepository.class);