Zestawy rozmówBlog

Twoja wymarzona praca? Lets Git IT.
Interaktywna platforma przygotowująca do rozmów technicznych dla nowoczesnych programistów.

XGitHub

Platforma

  • Kategorie

Zasoby

  • Blog
  • O aplikacji
  • FAQ
  • Sugestie

Prawne

  • Polityka prywatności
  • Regulamin

© 2026 LetsGit.IT. Wszelkie prawa zastrzeżone.

LetsGit.IT/Kategorie/Spring
Springhard

Proxy w Spring AOP — na czym polega problem self-invocation?

Tagi
#aop#proxy#transactional
Wróć do kategoriiPrzejdź do quizu

Odpowiedź

Spring AOP zwykle działa przez proxy wokół beana. Gdy metoda w tej samej klasie wywoła inną „aspektowaną” metodę bezpośrednio (`this.someMethod()`), omija proxy, więc np. `@Transactional` może się nie zadziałać.

Odpowiedź zaawansowana

Głębiej

Spring AOP jest zwykle **oparte o proxy**:

  • JDK dynamic proxy, gdy proxujesz interfejs.
  • CGLIB, gdy proxujesz klasę (podklasa).

Proxy przechwytuje wywołania **idące przez proxy**. Gdy kod w beanie wywołuje metodę na `this`, nie wychodzi poza obiekt docelowy, więc proxy nie ma szans tego przechwycić.

Przykład (problem)

@Service
class BillingService {
  @Transactional
  public void pay() { /* ... */ }

  public void run() {
    this.pay(); // omija proxy -> brak transakcji
  }
}

Rozwiązania

  • Wyciągnij metodę/aspekt do innego beana i wołaj ten bean.
  • Wstrzyknij proxowany interfejs i wołaj przez niego (uważaj na projekt).
  • AspectJ weaving tylko jeśli naprawdę potrzebujesz self-invocation.

Typowe pułapki

  • `@Transactional` na metodach private i oczekiwanie działania.
  • Wołanie „pomocniczych” metod z aspektami w tej samej klasie.
  • Testy, które tworzą klasy przez `new` (bez proxy), a potem oczekują zachowania AOP.

Powiązane pytania

Spring
Metody `@Async`: jak działają i jakie są typowe pułapki?
#spring#async#executor
Spring
`@Cacheable`: jak działa cache w Springu i podaj dwie pułapki?
#spring#cache#cacheable
Spring
Co to jest `BeanPostProcessor` i kiedy byś go użył?
#spring#beanpostprocessor#aop
Spring
Jak działa `@Async` w Springu i jaka jest typowa pułapka?
#async#executor#proxy
Spring
Jak działa `@Transactional` (rollback + typowa pułapka)?
#transaction#transactional#rollback
Spring
Jak działa @Transactional?
#transaction#aop#database