Jak tworzyć nowy prototype bean wstrzykując go do singleton bean?

0

Używam springa.
Jak tworzyć nowy prototype bean za każdym razem gdy wstrzykujemy go do singleton bean?

Normalnie jeśli wstrzyknę prototype beana do singletona to ten objekt będzie i tak tylko raz zainicjalizowany.

Znacie sposób jak to obejść?

0

Ja używałem proxyMode np. coś takiego:

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode =   ScopedProxyMode.INTERFACES)
0

hmm faktycznie może działać.

A czy jak będę miał coś odpalane w kilku wątkach to nie będzie jakiś problemu?

0

i jeśli takich beanó nie jest mało... to czy to nie jest bardzo kosztowne ?

0

potrzebuje czasem odswiezyc stan tych beanow, ale obawiam sie, ze tworzenie tych obiektow za kazdym razem to troche hardcore.

Czy moze lepiej zrobic Scheduler który będzie odświeżał je co jakiś czas?

0

Pytanie po co tak? Singleton bean żyje przez cały czas działania aplikacji (uproszczenie patrz konfiguracja inicjalizatorów) i JEST TYLKO JEDEN. Prototype bean żyje w określonym czasie i JEST ICH DUŻO. Zatem jak jesteś wstanie stwierdzić czy w jednej jedynej instancji singletona już czas podmienić pole na kolejny prototyp, czy jeszcze należy poczekać?

ps. beany można każdorazowo pobierać z kontekstu i wtedy to zaczyna mieć sens.

0

No pewnie to jest zly trop.

Moj problem jest taki, ze to beany z rest clientami. Potrzebuje im co jakis, dynamicznie podawac im urle gdzie maja callowac , odswiezac .

I zastanawiam sie jak najlepiej to robic.

0

Nie moge.

Mamy microservices i rozne srodowiska. Jest sobie tez service discovery w ktorym appki sie rejestruja i moze podawac linki dla odpowiedniego srodowiska. Appki sa w stanie cachowac ta informacje. Potrzebne im te urle, zeby wiedzirc gdzie leza inne serwisy.

Wczesniej mielismy to podane w pliku a rest clienty \ ich beany byly tworzone z odpowiednimi adresami przy starcie aplikacji.

Ale teraz chcialbym moc odswiezac linki do odpowiednich aplikacji.

0

Kod, który sprawia problem zawsze można podać. Co będzie w tym przypadku singletonem, co prototypami?

0

singletonem będą praktycznie wszystkie inne beany a rest klienty prototypami.
Ale obawiam się, że jest to słabe rozwiązanie, bo tych prototypów będzie się trochę twórzyć, spring wokół tego będzie robił jeszcze proxy.

Nie wiem czy nie spowoduje to problemow z performancem.

0

Jeżeli zatem masz jakiś serwis w którym klienci rejestrują się to można zrobić tak, że w tym serwisie trzymasz mapę z URLami do klientów, a następnie w tworzysz beany za pomocą np. kontekstu:

Client client = applicationContext.getBean(Client.class, urls.get("clientName"));

i zabijasz go na końcu metody. Czy to jest wydajne? Jeżeli nadal kilka rzędów wielkości szybsze niż komunikacja po sieci (chyba, że masz specjalizowany sprzęt z 10Gbit ethernet w ramach łączenia szaf). Można to dodatkowo przyozdobić jakimiś WeakHashMapami, które będą robić za cache.

0

Service zwraca mapę urli i aplikacje potrafią ją sobie cashować, więc ta komunikacja po sieci nie jest tak częsta, jest sterowana.

Client client = applicationContext.getBean(Client.class, urls.get("clientName"));

niby brzmi spoko. Ale czy nie będzie trzeba się w ten sposób namachać z refaktoryzacją? Miejsc gdzie są wstrzykiwane klienty jest masa, w dodatku w różnych aplikacjach.

Czy może zrobić sobie klase w stylu Refresher i dodac tam Schedulera, który będzie odświeżał te beany i ładował do kontekstu ?

0

Miejsc gdzie są wstrzykiwane klienty jest masa, w dodatku w różnych aplikacjach.

To najpierw zrefaktoryzować, by mieć spójny mechanizm. Potem można sobie z niego korzystać zmieniając tylko implementację, a nie dotykając API.

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