Spring MVC

0

Uczę się Spring mvc aktualnie i takie pytanie o DI,
ogólnie jeśli korzystam ze wstrzykiwania to powinno wyglądać mniej więcej tak :

@Autowired
IA a 

czyli mamy zmienną a która jest typu Interfejsu A.
A w Kursie jaki robie teraz jest

 
@Autowired
A a

A przecież chodzi o to żeby tam podawać interfejsy aby były mniejsze zależności między klasami etc.
Być może to był taki skrót autora kursu, albo ja jestem w błędzie.

w drugim przykładzie jest po prostu zmienna a typu klasy A.
Wiem, że jak coś wstrzykuje to korzystne jest z klasy która implementuje dany interfejs.

1

Interfejsy muszą mieć jakieś logiczne zastosownie. Wydzielenie interfejsu "żeby był" to idiotyzm. Jeśli nie planujesz mieć więcej niż jednej implementacji, nie planujesz tam używać dynamicznych proxy z AOP (np. poprzez oznaczanie czegoś jako @Transactional), nie masz wielomodułowego projektu z krzyżowymi zależnościami to nie ma sensu wydzielać interfejsów. Zresztą YAGNI -> jak sie pojawi potrzeba to "extract interface" możesz przeprowadzić w ciagu 5 sekund.

0

@Transactional nie wymaga interfejsow wiec ten przyklad/uzasadnienie jest mylace. Z dokumentacji:
'You can place the @Transactional annotation before an interface definition, a method on an interface, a class definition, or a public method on a class.'
Co wiecej, ponizej jest takie oto cos:
'Spring recommends that you only annotate concrete classes (and methods of concrete classes) with the @Transactional annotation, as opposed to annotating interfaces.'

0

@the real mućka Nigdzie nie pisałem o oznaczaniu interfejsu przez @Transactional, ba, wręcz przeciwnie, ta adnotacja nie jest propagowana więc oznaczajac interfejs wcale nie oznaczasz implementujących klas. Poświecę się i wyjaśnie w czym rzecz: otóż wstrzykiwanie obiektów klas oznaczonych jako @Transactional poprzez konkretną klasę a nie interfejs niekoniecznie jest takie proste i często po prostu nie zadziała. Dzieje sie tak, ponieważ @Transactional musi zrobić dynamiczne proxy twojej klasy a następnie wstrzyknąć to proxy w odpowiednie miejsce. Problemu z tworzeniem proxy przy wstrzykiwaniu przez interfejs generalnie nie ma, ot proxy jest klasą implementującą dany interfejs. Ale jeśli próbujesz wstrzyknać takie proxy w miejsce gdzie użyłeś konkretnej klasy to twoje proxy musiałoby z tej klasy dziedziczyć.
Możliwe, że teraz to już jakoś rozwiązali, ale jeszcze z 1-2 lata temu w Springu 3 AOP nie potrafił tego zrobić i konieczne było wstrzykiwanie przez interfejs w takiej sytuacji. Dla klas finalnych pewnie w ogóle innego rozwiązania nie ma.

edit: tu jest opisany ten problem http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-introduction-proxies

0

Ja wiem i ty wiesz jak to dziala i jakie sa problemy, nie w tym rzecz. Mi chodzi o to stwierdzenie:

Jeśli nie planujesz mieć więcej niż jednej implementacji, nie planujesz tam używać dynamicznych proxy z AOP (np. poprzez oznaczanie czegoś jako @Transactional), nie masz wielomodułowego projektu z krzyżowymi zależnościami to nie ma sensu wydzielać interfejsów.

Moim zdaniem jak byk jest napisane, ze jesli planuje sie uzywac dynamicznych proxy z AOP (np. poprzez oznaczanie czegos jako @Transactiona)l, to ma sens wydzielenie interfejsow. A to prawda nie jest. Ale nigdy nie bylem mocny z algebry booleanowskiej, wiec mozliwe ze jednak powiedziales cos innego, i wcale nie probujesz tego zatuszowac pozostalymi madrosciami.

Co do problemu - adnotacje na interfejsach nie sa dziedziczone przez klasy ktore je implementuja, to wszystko. To tak jakby dac synchronized na metodzie interfejsu - nic to nie znaczy dla klasy ktora ta metode implementuje (prawde mowiac nie wiem czy to sie by skompilowalo ;d).

0

Moim zdaniem jak byk jest napisane, ze jesli planuje sie uzywac dynamicznych proxy z AOP (np. poprzez oznaczanie czegos jako @Transactiona)l, to ma sens wydzielenie interfejsow. A to prawda nie jest

Ale jest to prawda najprawdziwsza, o czym mówi podany przeze mnie wyżej link. Jeśli masz AOP w jakiejś klasie to wstrzykiwanie obiektu tej klasy poprzez klasę a nie interfejs może zwyczajnie nie działać przy domyślnej konfiguracji Springa. Więc jeśli ktoś chce używać AOP w jakiejś klasie i chce ją wstrzykiwać to warto jednak wydzielić interfejs.

0

Wstrzykiwanie zależności to jest oszustwo. Jako wzorzec projektowy ma rozluźniać architekturę, podczas kiedy w praktyce rozluźnia ją może tylko w głowie architekta, a w praktyce służy do stosowania różnych sztuczek realizowanych przez kontener.

1 użytkowników online, w tym zalogowanych: 0, gości: 1