Spring MVC

Odpowiedz Nowy wątek
2015-07-15 09:17
niezalogowany123
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.

Pozostało 580 znaków

2015-07-15 09:22
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.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2015-07-15 09:22

Pozostało 580 znaków

2015-07-15 10:13
the real mućka
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.'

Pozostało 580 znaków

2015-07-15 10:29
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/[...]html#aop-introduction-proxies


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 4x, ostatnio: Shalom, 2015-07-15 10:37

Pozostało 580 znaków

2015-07-15 12:52
the real mućka
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).

Pozostało 580 znaków

2015-07-15 14:06
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.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-07-15 15:09
zirokuul d0d9ab06
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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