2012-07-20 4 views
23

스프링 데이터 문서를 읽는 동안 @NoRepositoryBean 인터페이스가 여러 번 발생했습니다. 스프링 데이터 이해 JPA @NoRepositoryBean 인터페이스

는 문서에서 인용 :

당신이 MyRepository의 인스턴스를 만들려고 봄 의 원인이됩니다 단지로 인터페이스를 사용하여 봄 네임 스페이스를 사용하여 자동 저장소 인터페이스 감지를 사용하는 경우. 물론 은 각 엔티티에 대해 정의하려는 리포지토리와 실제 리포지토리 인터페이스 사이의 inderly 역할을하기 때문에 바람직하지 않습니다. 으로 리포지토리를 인스턴스화하지 못하도록 인터페이스를 제외하려면 리포지토리 인스턴스에 @NoRepositoryBean으로 주석을 추가합니다.

그러나 언제, 어디에서 사용할 지 잘 모르겠습니다. 누군가 제게 구체적인 사용 예를 알려주고 조언 해 줄 수 있습니까?

답변

77

주석은 repo 인터페이스의 기준과 실제로 일치하지만 의도적이지 않은 인터페이스에 대한 저장소 프록시를 작성하는 것을 피하기 위해 사용됩니다. 기능으로 모든 저장소를 확장하기 시작하면 필요합니다. 예를 들어 보겠습니다.

모든 저장소에 foo() 메소드를 추가한다고 가정합니다. 다음과 같은 repo 인터페이스를 추가하면됩니다.

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

    void foo(); 
} 

구현 클래스, 팩토리 등을 추가 할 수도 있습니다.

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

를 동일한 패키지에 CustomerRepository을 가지고 있기 때문에 당신은 com.foobar를 사용 : - -의 스프링 데이터 JPA를 가정 해 봅시다 다음과 같이

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

} 

은 이제 부트 스트랩 가정 : 당신 콘크리트 저장소 인터페이스는 지금 중간 인터페이스를 확장 할 . 스프링 데이터 인프라는 이제 MyBaseRepository이 구체적인 저장소 인터페이스가 아니라 추가 방법을 노출하기위한 중간 저장소 역할을한다는 것을 알 수있는 방법이 없습니다. 따라서 저장소 프록시 인스턴스를 만들고 실패하게됩니다. 이제 @NoRepositoryBean을 사용하여이 중간 인터페이스에 주석을 달아 봄 데이터를 알릴 수 있습니다.이 인터페이스에 대한 리포지토리 프록시 bean을 만들지 마십시오.

CrudRepositoryPagingAndSortingRepository도이 주석을 포함하는 이유이기도합니다. 우연히 패키지 스캔이 우연히 그 패키지를 선택한다면 (우연히 이런 식으로 구성했기 때문에) 부트 스트랩이 실패합니다.

짧은 설명 : 주석을 사용하여 리포지토리 인터페이스가 결국 리포지토리 빈 인스턴스로 끝날 수있는 후보로 선택되지 않도록합니다.

+3

올리버 (Oliver)의 설명에 감사드립니다. – balteo

+0

슈퍼 대답. 고맙습니다. – ozgur

+0

잘 설명 된 대답. – Mukti