該註釋用於避免爲接口創建存儲庫代理,而這些接口實際上與回購界面的標準相匹配,但不打算成爲一個。只有當您開始使用功能擴展所有存儲庫時才需要它。讓我舉一個例子:
假設你想爲你的所有倉庫添加一個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。
這種情況也是爲什麼CrudRepository
和PagingAndSortingRepository
也帶有這個註釋的原因。如果軟件包掃描會偶然發現(因爲您不小心以這種方式配置),引導程序將失敗。
長話短說:使用註釋來防止存儲庫接口被選爲最終作爲存儲庫bean實例的候選對象。
感謝這個詳細解釋奧利弗。 – balteo 2012-07-23 06:56:48
超級謝意。謝謝。 – ozgur 2017-06-14 09:30:01
很好地解釋了答案。 – Mukti 2017-06-30 20:19:42