dog_meat
#programowanie #java #spring

Spring jednak utrudnia pisanie poprawnego kodu obiektowego. Człowiek chce napisać normalną klasę, która posiada dane i bazujące na nich zachowania, ale nie da się w prosty sposób.
Jeśli chcemy dodać dane instancji, to najłatwiej to zrobić przez new, ale wtedy obiekt nie będzie zarządzany przez Springa i nie da się wstrzyknąć do niego zależności.
Jedyne rozwiązanie, jakie widzę, to wstrzyknąć pustego beana ze scope "prototype", a później przez setery poustawiać mu wszystkie dane, ale to bardzo zaśmieca kod i uniemożliwia tworzenie niemutowalnych klas, których jestem zwolennikiem.
  • Najlepsze
  • Wszystkie komentarze
witajswiecie
@dog_meat: a może tak ładować do kontekstu springa tylko klasy które tego potrzebują zamiast robić z niego kosz na wszystkie obiekty w programie ( ͡° ͜ʖ ͡° )つ──☆*:・゚

https://www.youtube.com/watch?v=ILBX9fa9aJo

polecam się zapoznać
bohme
bohme
bohme
3
@dog_meat: aha, i jak potrzebujesz coś takiego robić to najprawdopodobniej masz coś źle zaprojektowane
bohme
bohme
bohme
2
@dog_meat: to zrób sobie factory/buildera który będzie komponentem i w nim twórz te swoje obiekty. A do nich wrzucaj referencję do obiektów stworzonych przez Springa i wstrzykniętych do buildera.
E.....e
E.....e
@dog_meat: Chcesz mi powiedzieć ze jak ktos zrobi konstruktor i doda nad nim adnotacje autowired to wszystko niszczy? xD
P.....k
P.....k
Jeśli chcemy dodać dane instancji, to najłatwiej to zrobić przez new, ale wtedy obiekt nie będzie zarządzany przez Springa i nie da się wstrzyknąć do niego zależności.


@dog_meat: nie mam pojęcia w czym widzisz problem
E.....e
E.....e
@Ewentualnie: O kurde, nie rob tak xD, Swoja drogą jak bardzo chcesz korzystać z springowego injection to mozesz zarobic to przez ApplicationContext.getBean statyczna metodę, ale nienpolecam xD
dog_meat
dog_meat Autor
0
@Ewentualnie: No jak dasz autowired na konstruktor, to wstrzyknie Ci wszystko, a ja potrzebuję stworzyć zgodnie z paradygmatem OOP klasę, która ma dane przypisane do każdej instancji a oprócz tego dostarczyć zależności (które właśnie chciałbym dać przez autowired), czyli część parametrów dostarczam, a część wstrzykuję

@PrzegrywWykopek: no właśnie w tym, co napisałem wyżej. Zgodnie z OOP klasa powinna mieć indywidualne dane i przypisane do nich zachowania. A tu
Bairei
@dog_meat: Nie jestem pewien, czy chodzi tobie o coś takiego:
https://www.baeldung.com/spring-5-functional-beans
Nie wygląda to bardzo elegancko, ale powinno załatwić sprawę.
(klasa kontekstu kontenera oczywiście powinna być zmieniona)
dog_meat
dog_meat Autor
0
@witajswiecie: tak bym chciał, ale potrzebuję we wnętrzu tej klasy skorzystać z zależności zarządzanej przez Springa (jej też nie wywołam przez new, bo ona ma swoje zależności).

@witajswiecie: Nie do końca o to mi chodzi. Ja chciałbym tworzyć wiele instancji klasy, którea posiada indywidualne dane, wewnątrz której mogę wstrzyknąć zależnośc zarządzaną przez Springa.

Wrzuciłem prosty przykład na https://pastebin.com/pLMmEexa (to tylko kod wymyślony na potrzeby przykładu). <-- zawołam jeszcze
E.....e
E.....e
@dog_meat: nie bardzo wiem o co Ci chodzi mówiąc szczerze, nie rozumiem czemu chcesz wstrzykiwać część przez autowired, a część tworzyć przez new.
witajswiecie
@dog_meat: a nie możesz po prostu dodać springowego beana przez konstruktor do zwykłej klasy? abstrahując po co do dto wstrzykiwać cokolwiek, chyba że chcesz zrobić z tego active record, albo coś w tym guście ?
dog_meat
dog_meat Autor
0
@Ewentualnie: no popatrze przykład, który wrzuciłem. Pola firstName, lastName, city i age są indywidualne dla instancji. Ale jest pole devicesService, które jest beanem springowym i które potrzebuję wstrzyknąć. Czy masz jakąś propozycję, jak utworzyć klasę, która będzie posiadała powiedzmy firstName=Jan, lastName=Kowalski, City=Bydgoszcz, age=38 oraz devicesService, który jest beansem springowym?
witajswiecie
psst

@Component
class KlasaPodKontroląSpringa{
dog_meat
dog_meat Autor
0
@witajswiecie: to nie jest DTO, tylko właśnie typowa klasa, zgodna z OOP, która ma swoje dane i zachowania (w przykładzie nie dodawłem metod, bo stworzyłem go na szybko, ale powiedzmy, że będzie miał spory zestaw metod, które wyknują różne rzeczy, korzystając z serwisu)

@Ewentualnie: wiem, że są obejścia i mogę uzyskać kontekst, i pobrać beana. Ale chodziło mi o to, że Spring raczej zniechęca do pisania zgodnego z
dog_meat
dog_meat Autor
0
@bohme: Czemu źle? Jak dla mnie to jest właśnie rozwiązanie typowe dla OOP i DDD
dog_meat
dog_meat Autor
0
@Component

class KlasaPodKontroląSpringa{


@Autowired

Service
witajswiecie
@dog_meat:
to że łączysz dane i zależności jest winą przyjętej architektury a nie springa, scalowe implicit wcale nie rozwiązuje problemu w tej kwestii, nadal łączysz dane i logikę, tyle że to łączenie dokonuje się na poziomie kompilacji a nie przez kontener DI
dog_meat
dog_meat Autor
0
to że łączysz dane i zależności jest winą przyjętej architektury a nie springa, scalowe implicit wcale nie rozwiązuje problemu w tej kwestii, nadal łączysz dane i logikę, tyle że to łączenie dokonuje się na poziomie kompilacji a nie DI


@witajswiecie: przecież łączenie logiki i danych jest główną podstawą programowania obiektowego (przeciwieństwem jest programowanie strukturalne, które udaje obiektowe, które rozdziela logikę i dane, opakowując to w klasy)
diabel_z_piekla
@dog_meat: Zrób klasę factory, wstrzyknij tam:

private @Autowired AutowireCapableBeanFactory beanFactory;
i później gdzieś w metodzie: