2012-07-20 33 views
23

在閱讀Spring Data文檔時,我多次遇到了@NoRepositoryBean接口。瞭解Spring數據JPA @NoRepositoryBean接口

要從文件引用:

如果您使用自動倉庫接口檢測使用 春天命名空間使用,就像是會造成彈簧 努力創造MyRepository實例的接口。這當然不是 所需的,因爲它只是作爲知識庫和要爲每個實體定義的實際存儲庫接口之間的中介。至 排除擴展知識庫的界面被實例化爲 存儲庫實例使用@NoRepositoryBean註釋它。

但是,我仍然不確定何時何地使用它。有人可以建議並給我一個具體的使用示例嗎?

回答

77

該註釋用於避免爲接口創建存儲庫代理,而這些接口實際上與回購界面的標準相匹配,但不打算成爲一個。只有當您開始使用功能擴展所有存儲庫時才需要它。讓我舉一個例子:

假設你想爲你的所有倉庫添加一個foo()方法。您將開始添加像這樣的回購界面

public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> { 

    void foo(); 
} 

您還將添加相應的實施類,工廠等。您的具體資料庫界面現在將延長該中間接口:

public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> { 

} 

現在假設你引導 - 比方說春天數據JPA - 如下:

<jpa:repositories base-package="com.foobar" /> 

您使用com.foobar因爲你在同一個包有CustomerRepository 。 Spring Data基礎設施現在無法知道MyBaseRepository不是具體的存儲庫接口,而是作爲中間回購來公開其他方法。所以它會嘗試爲它創建一個存儲庫代理實例並失敗。您現在可以使用@NoRepositoryBean來註釋該中間接口,以實質上告訴Spring Data:不要爲此接口創建存儲庫代理bean。

這種情況也是爲什麼CrudRepositoryPagingAndSortingRepository也帶有這個註釋的原因。如果軟件包掃描會偶然發現(因爲您不小心以這種方式配置),引導程序將失敗。

長話短說:使用註釋來防止存儲庫接口被選爲最終作爲存儲庫bean實例的候選對象。

+3

感謝這個詳細解釋奧利弗。 – balteo 2012-07-23 06:56:48

+0

超級謝意。謝謝。 – ozgur 2017-06-14 09:30:01

+0

很好地解釋了答案。 – Mukti 2017-06-30 20:19:42