Nie do końca widzę problem. Nie wiem czy wiesz, ale obiekty zarządzane przez kontener można przekazywać jako argumenty... Zacznij od zrobienia klasy @Configuration
z definicja twoich singletonów i wywal z kodu wszystkie @Service
, @Inject
i @Autowired
. Następnie zauważ że nic nie stoi na przeszkodzie żeby zrobić new Cośtam(beanPrzekazanyDoTegoSingletona)
No dobrze: mam już tą klasę z @Configuration
w której tworzę sobie beany. Istnieje jakiś serwis w którym te beany wstrzykuje i wszystko jest w porządku - śmiga. Jedna z metod w tym serwisie tworzy sobie jakąś tam strategię - przesyłam do innej klasy (stworzonej przez new
) jakieś parametry wejściowe i w wyniku dostaję konkretną implementację (również stworzonej przez new
) jakiegoś tam interfejsu. No i teraz w środku tej metody w serwisie wołam na tej implementacji metodę zrobCosTam()
. W środku zrobCosTam()
potrzebowałbym dostępu jednego z Beana, którego mam zdefiniowanego w klasie z @Configuration
. Cały czas nie rozumiem jak mógłbym to zrobić.
Przyszły mi do głowy 3 opcje:
- Klasa, która dostarcza konkretnej strategii powinna przyjmować w konstruktorze parametr z tym beanem. Wtedy zamiast czegoś takiego:
SomeStrategy strategySupplier = new SomeStrategy();
StrategyImplementation strategyImplementation = strategySupplier.get(inputData);
strategyImplementation.zrobCosTam();
miałbym
SomeStrategy strategySupplier = new SomeStrategy(bean);
StrategyImplementation strategyImplementation = strategySupplier.get(inputData);
strategyImplementation.zrobCosTam();
Wtedy w klasie SomeStrategy
public StrategyImplementation get(InputData inputData){
switch(inputData)
case A:
new AStrategyImplementation(mojBeanZWarstwyWyzej);
return
}
No ale jeśli tych warstw klas byłoby kilka to musiałbym to przepychać, prawda?
-
Podobne rozwiązanie tylko, że zamiast w konstruktorze to wepchnąć tego beana do StrategyImplementation#zrobCosTam
-
W miejscu w którym chce wykorzystać tego beana wołać:
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(SomeConfigurationABC.class);
MojBeanKtoregoChce bean = annotationConfigApplicationContext.getBean(MojBeanKtoregoChce.class);
Nie mam pojęcia jakie są plusy - czy w ogóle są - a jakie minusy takiego rozwiązania.
Przepraszam za moją ułomność ale naprawdę czuję się zagubiony :D