Przede wszystkim nie ma miejsca na generowanie kodu, co oznacza: brak CGLib, w ogóle brak generowania kodu bajtowego. Podstawowym podejściem jest to, że instancja proxy JDK jest tworzona programowo przy użyciu ProxyFactory
interfejsu API Springa w celu wsparcia interfejsu i MethodInterceptor
przechwytuje wszystkie wywołania do instancji i kieruje metodę do odpowiednich miejsc:
- Jeśli repozytorium zostało zainicjowane z niestandardową częścią implementacji (zobacz tę część dokumentacji referencyjnej, aby uzyskać szczegółowe informacje), a wywołana metoda jest zaimplementowana w tej klasie, wywołanie jest tam kierowane.
- Jeśli metoda jest metodą zapytania (zobacz,
DefaultRepositoryInformation
jak to jest określane), mechanizm wykonywania zapytań określonego magazynu włącza się i wykonuje zapytanie określone jako wykonane dla tej metody podczas uruchamiania. W tym celu istnieje mechanizm rozstrzygania, który próbuje zidentyfikować jawnie zadeklarowane zapytania w różnych miejscach (używając @Query
w metodzie zapytań nazwanych JPA), ostatecznie wracając do wyprowadzania zapytania z nazwy metody. Aby uzyskać informacje na temat wykrywania mechanizmu zapytań, zobacz JpaQueryLookupStrategy
. Logikę analizowania dla wyprowadzania zapytania można znaleźć w PartTree
. Tłumaczenie konkretnego sklepu na rzeczywiste zapytanie można zobaczyć np JpaQueryCreator
. W.
- Jeśli żadna z powyższych nie ma zastosowania, wykonywana metoda musi być implementowana przez klasę bazową repozytorium specyficzną dla magazynu (
SimpleJpaRepository
w przypadku JPA), a wywołanie jest kierowane do jej instancji.
Interceptor metody implementujący tę logikę routingu to logika routingu QueryExecutorMethodInterceptor
wysokiego poziomu, którą można znaleźć tutaj .
Tworzenie tych serwerów proxy jest zawarte w standardowej implementacji wzorca Factory opartej na języku Java. Tworzenie proxy wysokiego poziomu można znaleźć w RepositoryFactorySupport
. Implementacje specyficzne dla sklepu dodają następnie niezbędne komponenty infrastruktury, aby w przypadku JPA można było śmiało napisać kod w następujący sposób:
EntityManager em = … // obtain an EntityManager
JpaRepositoryFactory factory = new JpaRepositoryFactory(em);
UserRepository repository = factory.getRepository(UserRepository.class);
Powodem, dla którego to wyraźnie wspominam, jest to, że powinno być jasne, że w swej istocie żaden z tego kodu nie wymaga przede wszystkim uruchomienia kontenera Spring. Potrzebuje Springa jako biblioteki na ścieżce klas (ponieważ wolimy nie wymyślać koła na nowo), ale generalnie jest agnostykiem kontenera.
Aby ułatwić integrację z kontenerami DI, oczywiście stworzyliśmy integrację z konfiguracją Spring Java, przestrzenią nazw XML, ale także rozszerzeniem CDI , dzięki czemu Spring Data może być używany w zwykłych scenariuszach CDI.
@Repository
opisane interfejsy w pierwszej kolejności? Patrząc na,RepositoryFactorySupport#getRepository()
pokaż, że przyjmuje klasę interfejsu jako parametr, więc musi zostać znaleziona gdzie indziej. Szczególnie staram się dowiedzieć, jak znaleźć interfejs z adnotacjami i automatycznie wygenerować komponent bean proxy JDK, który implementuje interfejs, bardzo podobny do danych wiosennych, ale do celów specyficznych dla aplikacji, niezwiązanych z repozytoriami.RepositoryComponentProvider
. Nie dzieje się automatycznie, ale skanowanie komponentów dla niektórych typów (z adnotacjami lub z adnotacją) iFactoryBean
skonfigurowane dla każdego z nich.