Hej,

Mam w swoim kodzie fragment, który zawsze wzbudza we mnie emocje i zastanawiam się czy aby na pewno jest napisany zgodnie z dobrą sztuką programowania. Otóż mam klasę abstrakcyjną, która przy każdym request'cie za pomocą deserializatora(jackson) jest rzutowana na odpwiedni obiekt konkretny(na podstawie wartości pola type). Każda z klas nich musi nadpisać metodę delegate. Dodatkowo każda z klas dziedziczących przetrzymuje inne, specyficzne obiekty.

class A
{
private String type;
private Service service;
A()
{
service = (Service) ApplicationContextProvider.getApplicationContext().getBean(
				"service");
}
abstract void delegate();
}

class B extends A
{
private Obj1 obj1;
@Override
public void delegate(){
service.method1();
};
}

class C extends A
{
private Obj2 obj2;
@Override
public void delegate(){
service.method2();
};
}
 

Jackson tworzy obiekt poza kontekstem Springa tj. klasa nie może być komponentem, czyli nie można użyć adnotacji @Autowired. A ja bym chciał, ponieważ w metodzie delegate chciałbym wywołać odpowiednią metodę z serwisu. Radzę sobie w ten sposób, że w konstruktorze klasy A sięgam do statycznej metody klasy ApplicationContextProvider i wyciągam sobie z niej beana serwisu.

Pytania:
-czy takie mieszanie scope-ów tj. klasy A protoypowy(nie springowy) i klasy Service(singleton) jest poprawne?
-czy takie wyciąganie beana z kontakstu za każdym requestem dla klasy A jest wydajne/poprawne?
-czy da się w jakiś inny sposób na użytkowniku który będzie rozszerzał klasę A wymusić pewne zachowania(w klasie A jest jeszcze metoda szablonowa która "zbiera do kupy" nadpisane przez użytkownika metody i wywołuje je w odpowiedniej kolejności). Wrzucenie takich polimorficznych klas bezpośrednio do serwisu spowodoałoby konieczność rzutowania na klasy konkrente(aby mieć dostęp do Obj1 lub Obj2), poza tym nie wymuszałoby na użytkowniku żadnych zachowań, kolejności etc.