2012-07-20 9 views
23

Kilka razy napotkałem interfejs @NoRepositoryBean podczas odczytu dokumentacji Spring Data.Omówienie danych źródłowych Interfejs JPA @NoRepositoryBean

Cytując z dokumentacji:

Jeśli używasz automatycznego wykrywania interfejsu repozytorium używając nazw Wiosna pomocą interfejsu tak jak jest spowoduje Wiosna próbuje utworzyć wystąpienie MyRepository. Nie jest to oczywiście pożądane, ponieważ działa jako pośrednie pomiędzy Repository i rzeczywistymi interfejsami repozytoriów, które chcesz zdefiniować dla każdej jednostki. Aby wykluczyć interfejs rozszerzający repozytorium z instancji w postaci repozytorium , dodaj adnotację do numeru @NoRepositoryBean.

Jednak nadal nie jestem pewien, kiedy i gdzie go używać. Czy ktoś może mi doradzić i podać konkretny przykład użycia?

Odpowiedz

77

Adnotacja służy do uniknięcia tworzenia proxy repozytoriów dla interfejsów, które faktycznie pasują do kryteriów interfejsu repo, ale nie mają być nimi objęte. Jest to wymagane tylko po rozpoczęciu rozszerzania wszystkich repozytoriów o funkcjonalność. Podam przykład:

Załóżmy, że chcesz dodać metodę foo() do wszystkich swoich repozytoriów. Zaczynasz od dodania interfejsu repo, takiego jak ten, aby uzyskać odpowiednią klasę implementacji, fabrykę i tak dalej. byś konkretne interfejsy repozytorium teraz przedłużyć ten pośredni interfejs:

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

} 

Załóżmy teraz bootstrap - powiedzmy Wiosna danych JPA - następująco:

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

użyć com.foobar bo trzeba CustomerRepository w tym samym opakowaniu . Infrastruktura Spring Data nie ma obecnie możliwości stwierdzenia, że ​​MyBaseRepository nie jest interfejsem konkretnego repozytorium, ale raczej działa jako pośrednie repozytywanie w celu odsłonięcia dodatkowej metody. Tak więc spróbuje utworzyć instancję proxy repozytorium dla niego i zawiedzie. Możesz teraz użyć @NoRepositoryBean, aby opisać ten interfejs pośredni, aby w zasadzie powiedzieć Spring Data: nie twórz komponentu bean repozytorium proxy dla tego interfejsu.

Ten scenariusz jest również powodem, dla którego CrudRepository i PagingAndSortingRepository noszą również tę adnotację. Jeśli skanowanie pakietów wybierze je przypadkowo (ponieważ przypadkowo skonfigurowałeś to w ten sposób) bootstrap zakończyłby się niepowodzeniem.

Krótka historia: użyj adnotacji, aby zapobiec przechwytywaniu interfejsów repozytorium jako kandydatom, aby ostatecznie zakończyć tworzenie instancji bean repozytorium.

+3

Dzięki za to szczegółowe wyjaśnienie Oliver. – balteo

+0

Super odpowiedź. Dziękuję. – ozgur

+0

Ładnie wyjaśniona odpowiedź. – Mukti

Powiązane problemy