Wpis z mikrobloga

Mirki z #java #spring - czytam sobie książkę od zera do bohatera, natrafiłem na rozdział o AOP. Może ktoś mi powiedzieć dlaczego tak jest a nie inaczej? Sytuacja:
Mam bean cdPlayer, który ma Autowired interfejs CompactDisc z metodami play() oraz playTrack(int number). cdPlayer ma metodę playCD(), który wywołuję metodę play() w CompactDisc. Ostatnim ważnym szczegółem jest fakt, że moja implementacja CompactDisc, której używam wszędzie, w metodzie play() wywołuje na każdym utworze dziedziczoną po CompactDisc playTrack(int number).
Problem i pytanie:
Zrobiłem test, wczytałem konfiguracje, w których zadeklarowałem, aby przed play() oraz playTrack(int number) w CompactDisc wykonywało się jakieś logowanie. Test ma Autowired cdPlayer, całość sprowadza się do wywołania na nim cdPlayer.playCD(). Dlaczego w logach widoczne jest wywołanie tylko metody play(), a nie widać poszczególnych playTrack, które są wywoływane wewnątrz play()? W przypadku bezpośredniego wywołania na CompactDisc metody playTrack(int number) aspekt jest wywoływany.
  • 11
Może w skrócie - dwie metody z interfejsu są otagowane przez aspekty. W implementacji, jedna metoda wywołuje drugą. Przy wywołaniu jednej metody używając referencji typu interfejsu aspekt dla drugiej nie jest wychwytywany.
@wafel93: Lepiej wrzuc kod zamiast pisac eseje ( ͡° ͜ʖ ͡°)

Ostatnim ważnym szczegółem jest fakt, że moja implementacja CompactDisc, której używam wszędzie, w metodzie play() wywołuje na każdym utworze dziedziczoną po CompactDisc playTrack(int number).


Chyba chodzi o to - jesli metoda nie jest wywolywana poprzez interfejs (pod ktory Spring wstrzykuje proxy), to AOP nie bedzie dzialac (zakladajac, ze nie uzywasz zadnego bytecode weavera).
@Kresse jest tak jak mówisz :) jak rozumiem, aspekt jest tutaj jakby pośrednikiem. A wiec z tego punktu widzenia, wrapper nie ma pojęcia, ze implementacja met A wywołuje B. Skoro rozumiem jak to działa, to teraz trzeba juz tylko zrozumieć jak to obejść
@wafel93: Mozna:

1. Wplesc aspekty wczesniej niz w runtime (np. juz przy kompilacji).
2. We wlasnej implementacji nie uzywac dziedziczenia, tylko delegacji do autowire'owanego pola, ale to raczej slaby design, jezeli AOP jest jedynym powodem ku temu.
3. Zmienic architekture tak, zeby standardowe zachowanie Springa wystarczalo ( )