建立倉庫例項

本節介紹如何為已定義的倉庫介面建立例項和 Bean 定義。

Java 配置

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

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

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

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

XML 配置

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

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

使用過濾器

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

例如,要排除某些介面不被例項化為倉庫 Bean,您可以使用以下配置

使用過濾器
  • Java

  • XML

@Configuration
@EnableNeo4jRepositories(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 環境中。您仍然需要在類路徑中包含一些 Spring 庫,但通常也可以透過程式設計方式設定倉庫。提供倉庫支援的 Spring Data 模組附帶一個特定於持久化技術的 RepositoryFactory,您可以如下使用

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