建立 Repository 例項

本節介紹如何為定義的 Repository 介面建立例項和 bean 定義。

Java 配置

在 Java 配置類上使用儲存特有的 @EnableJpaRepositories 註解來定義 Repository 啟用配置。有關 Spring 容器的基於 Java 的配置的介紹,請參閱Spring 參考文件中的 JavaConfig

啟用 Spring Data Repository 的示例配置如下所示

基於註解的 Repository 配置示例
@Configuration
@EnableJpaRepositories("com.acme.repositories")
class ApplicationConfiguration {

  @Bean
  EntityManagerFactory entityManagerFactory() {
    // …
  }
}
上面的示例使用了 JPA 特有的註解,您應該根據實際使用的儲存模組進行更改。這同樣適用於 EntityManagerFactory bean 的定義。請參閱有關儲存特定配置的部分。

XML 配置

每個 Spring Data 模組都包含一個 repositories 元素,允許您定義一個 Spring 為您掃描的基礎包,如以下示例所示

透過 XML 啟用 Spring Data Repository
<?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 名稱會加上其封閉型別的名稱作為字首。基礎包屬性允許使用萬用字元,以便您可以定義掃描包的模式。

使用過濾器

預設情況下,基礎設施會拾取配置的基礎包下擴充套件了持久化技術特定 Repository 子介面的每個介面,併為其建立一個 bean 例項。但是,您可能希望對哪些介面建立 bean 例項進行更精細的控制。為此,可以在 Repository 宣告內部使用 filter 元素。其語義與 Spring 元件過濾器中的元素完全相同。詳情請參閱Spring 參考文件 中關於這些元素的部分。

例如,要排除某些介面被例項化為 Repository bean,您可以使用以下配置

使用過濾器
  • Java

  • XML

@Configuration
@EnableJpaRepositories(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,您可以按如下方式使用它

Repository 工廠的獨立使用
RepositoryFactorySupport factory = … // Instantiate factory here
UserRepository repository = factory.getRepository(UserRepository.class);