Java Spring -- przykład problemu, jaki ostatnio rozwiązałeś(-aś)

Odpowiedz Nowy wątek
2019-01-12 14:44
Tig
0

Proszę o podanie przykładu problemu związanego konkretnie z frameworkiem Spring, na który ostatnio natrafiłeś(-aś), z ewentualnym podsumowaniem rozwiązania.

Interesuje mnie to, ponieważ temat znajomości Spring pojawia się bardzo często w rozmowach na forum, ja sam piszę oprogramowanie korzystające ze Springa.
W związku z tym, że to nie ja wymyśliłem architekturę, moja styczność z samym Springiem ogranicza się do rzeczy bardzo mocno trywialnych -- w zasadzie tylko tworzę w beans.xml kolejne definicje pól w obiektach (DI?), kolejnych parametrów konfiguracji, kolejnych odpalanych wątków.

Nigdy nie byłem świadkiem tego, by ktoś miał problem z samym Springiem, natomiast oczywiście byłem świadkiem sporej liczby problemów związanych z programowaniem i technologiami pokrewnymi.

PS Uprzedzając pytania, oczywiście googlowałem niejednokrotnie czym Spring jest i jak się ma do alternatywnych rozwiązań.

Pozostało 580 znaków

2019-01-12 16:01
1

Dosyć niedawno natrafiłem na typowy problem circular reference xd Jako, że w obu komponentach wstrzykiwanie miałem przez konstruktor. Wiem, że taka sytuacja może wskazywać na zły design, ale w tej konkretnej sytuacji ciężko mi było coś innego wymyślić. Jak naprawiłem? Wybrałem jeden z tych dwóch komponentów, w którym wstrzykiwana zależność nie jest wymagana od początku istnienia, i zmieniłem wstrzykiwanie przez konstruktor na wstrzykiwanie przez setter, z dodatkową adnotacją @Lazy xd

tak, wiem, zaraz @scibi92, @jarekr000000 i @Shalom na mnie naskoczą że hurr durr, jak to przez setter, na pewno można było zrobić lepiej :D :D :D

Pokaż pozostałe 3 komentarze
Żaden rakotwórczy kod :P poza tym wcale moim wymaganiem nie jest szukanie repo z idealnym kodem ;) ważne żeby było czytelne i tyle - Pinek 2019-01-12 17:23
Ta. circle refence to nie kod rakotwórczy :P - scibi92 2019-01-12 17:29
Sam tworzyłem od nowa ten kod :D więc chyba to ja tworzę raki - Pinek 2019-01-12 17:30
A to wiele wyjaśnia. PS edytowałem posta wyzej sugeruje obczaić ;] - scibi92 2019-01-12 17:31
Moim skromnym, nic nie znaczącym zdaniem adnotacja @Lazy nie powinna istnieć. Problem powinieneś rozwiązać poprzez naprawienie architektury, bo circular reference masz dalej, tylko zatuszowałeś to za pomocą hack'a/workaround'a. Może to doprowadzić do architektury big-ball-of-mud - Tyvrel 2019-01-14 09:45

Pozostało 580 znaków

2019-01-12 16:08
2

@Pinek: Nie rozwiązałeś problemu. Cykliczna zależność dalej występuje. Naprawiłeś co najwyżej błąd rzucany przez kontener DI.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Pokaż pozostałe 2 komentarze
Inaczej mówiąc: błędnie zakładasz, że jeśli program poprawnie działa to jest dobrze napisany. - Wibowit 2019-01-12 16:14
Nie no to oczywiście masz rację, natomiast autorowi wątku chodzi o problem stricte ze Springiem - czyli, no mówiąc bez ogródek, żeby właśnie program działał i nie było exceptionów. Rozwiązywanie problemów architektonicznych jest na wyższym poziomie i nie musi być związane ze Springiem. - Pinek 2019-01-12 16:16
Ostatnio mid u mnie w zespole nie wiedział dlaczego nie może czegoś tam wstrzyknąć (guice). Dodał na pałę binding i zadowolony, że działa. Mówię mu, że przecież mamy w projekcie mechanizmy skanujące o tak dalej i to powinno działać bez tego, błąd musi być gdzie indziej. Oburzył się strasznie "no ale przecież działa to o co mi chodzi". To smutne, że podejście "jak działa to jest OK" jest tak powszechne. - Berylo 2019-01-13 12:19
@Berylo: czemu smutne? Poza tym, jeśli twój komentarz kierowałeś do mnie, to wcale takim czymś się nie kieruję ;) - Pinek 2019-01-13 23:27
Po prostu twój komentarz mi o tym przypomniał. - Berylo 2019-01-13 23:31

Pozostało 580 znaków

2019-01-12 16:09
0

@Pinek jak to przez setter, na pewno dało się lepiej :d

A poza tym z tym Hibernate jest troche inaczej. Np. masz relacje User <-> Role, to jak załadujesz User z rolami to role nie będa tak naprawde wskazywac na usera, de facto to będzie załadowane jak jeden do wielu :)


Nie pomagam przez PM. Pytania zadaje się na forum.
edytowany 1x, ostatnio: scibi92, 2019-01-12 17:30
A relacje many to many? 8) - Pinek 2019-01-12 17:32
No to jest własnie many-to-many ale w praktyce Hibernate załaduje ją jako jeden do wielu AFAIK, ale to musze się upewnić :P - scibi92 2019-01-12 17:33

Pozostało 580 znaków

2019-01-12 18:25

hurr durr, jak to przez setter, na pewno można było zrobić lepiej

a w temacie:

  1. Ale dziś magię rozwaliłem. P...

  2. dość czesto napotykam się na walki z wątkami (ForkJoinPool) i Spring, to nie jest dobre połączenie, a najgorsze, że często długo dobrze działa.

  3. Najgorsze problemy są związane z użyciem specyficznych scope - typu np. RequestScope. Człowiek siedzi przez trzy dni i się zastanawia, jak to się dzieje, że mimo zmiany jakiś parametrów, jakieś metody w środku backendu nadal magicznie dostają orginalne wartości. Ogólnie dla ludzi, którzy korzystają z RequestScope powinno być specjalne piekiełko.
    JobScope w springbatch tak samo .

  4. Czasem po refaktoringu metody przestają być public.. a mają adnotacje. (Transactional, różne Security..) i wtedy te magie przestają działać (zwykle łatwo się to wyłapuje jak już się problem pojawi, ale takie syfy czasem potrafią przelecieć przez review).

  5. Testowanie tego wszystkiego co wg autorów springa jest nieważnym szczegółem implementacyjnym i lecie na adnotacjach, aspektach (transakcje, security).. jest dosyć żmudne, albo raczej mało wiarygodne. na testach zwykle działa ok. Pechowo, pracowałem w firmie gdzie security nie było nieważnym szczegółem.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 3x, ostatnio: jarekr000000, 2019-01-12 19:28
Offtop: Nie daje mi to spokoju:) Zawsze przebierasz się za maga na konferencjach? Bo zakładam, że to Ty:) Swoją drogą bardzo ciekawy temat miałeś na JDD. - Berylo 2019-01-13 12:23
Taki kombinezon roboczy i generalnie tylko na zimne pory. - jarekr000000 2019-01-13 12:38
Uff, już się bałem, że chodzisz tak na co dzień ;) - Berylo 2019-01-13 12:39
Teraz jest zima to chodzę tak czasem. - jarekr000000 2019-01-13 12:39

Pozostało 580 znaków

2019-01-12 21:34
0

@jarekr000000: a tak z ciekawoci do czego stosujesz Fork and Join ze Springiem? Bo tu mnie zaskoczyłeś :P


Nie pomagam przez PM. Pytania zadaje się na forum.
To nie ja ! Ale, zdażyło mi się taki kod powstrzymać. - jarekr000000 2019-01-12 23:34
No rozumiem. Powiem szczerze że mnie zaskoczyło to albowiem ForkAndJoin tak średnio mi pasuje do aplikacji enterprasjowych, ale mogło się okazać że się myle i wolałem dopytac :P - scibi92 2019-01-12 23:36
To był konkretnie case związany rozbiciem dłuższego batch uploadu na kawałki. Nie pamiętam szczegółów. Ten forkjoin chyba nie był bardzo głupim pomysłem... ale w springowej aplikacji średnio mógł działać. - jarekr000000 2019-01-12 23:39
@jarekr000000: a wykonywał on jakies operacje I/O ? Bo generralnie czytałem że FAJ nie jest zalecany to tego :P - scibi92 2019-01-12 23:41
Tam nawet było IO na pewno. Ale to była własna instanca nie common. - jarekr000000 2019-01-13 12:24

Pozostało 580 znaków

2019-01-13 20:23
Tig
0

Dzięki @jarekr000000 oraz @Pinek (kolejność wedle kalibru odpowiedzi) za przykłady.

@jarekr000000
Odn. 1. oraz 5. Ciekawy problem, dobrze wiedzieć. Ciekawa lektura także samych komentarzy. Wychodzi na to, że nie każdy lubi magii sterowania przez XMLe, magicznych pól, które wyglądają na nigdzie nie inicjalizowane, itd. itp.
Odn. 2. Zakładam, że chodzi o podnoszenie przez Springa beana, który dzieli sobie pracę wielowątkowo. Co dokładnie tam jest powodem do walki, to ciężko mi wywnioskować.
Odn. 3. Ciekawe, myślę że rozumiem, miewałem chyba-analogiczne problemy z różnymi zasięgami różnych sesji jednego "użytkownika".
Odn. 4. Dobrze wiedzieć.

Pinek, problem ciekawy, na tyle nieskomplikowany, że nawet ja rozumiem (albo mi się tak wydaje). Specjalne wyróżnienie za poziom humoru w dyskusji, uśmiałem się :)

Konkludując, trzeba mi się będzie kiedyś przebić przez jakieś bardziej zaawansowane tutoriale Springa, a nie męczyć użytkowników :)

edytowany 1x, ostatnio: Tig, 2019-01-13 20:25

Pozostało 580 znaków

2019-01-13 20:25
0

Odn. 2. Zakładam, że chodzi o podnoszenie przez Springa beana, który dzieli sobie pracę wielowątkowo. Co dokładnie tam jest powodem do walki, to ciężko mi wywnioskować.

To że Spring korzysta z ThreadLocali w aspektach do zarzadząnia transakcjami :)


Nie pomagam przez PM. Pytania zadaje się na forum.

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