Jestem nowy w Spring i używam wersji Spring 3.2.2. Mam trochę fasoli, którą wstrzyknięto przez <constructor-arg>
, która działa dobrze. Teraz chciałem wstrzyknąć trochę fasoli przez @Autowired
, co całkowicie poszło nie tak. Zrobiłem tak:Spring java.lang.LinkageError: naruszenie ograniczenia programu ładującego: program ładujący wcześniej zainicjował ładowanie dla innego typu o nazwie X
beans.xml:
<context:annotation-config />
<bean id="formulaFactory" class="my.project.formula.impl.GenericFormulaFactory"
factory-method="getInstance">
<qualifier value="formulaFactory"></qualifier>
</bean>
Java źródło:
@Autowired
@Qualifier("formulaFactory")
private FormulaFactory formulaFactory;
(Zmiana kwalifikator lub pozostawienie go na zewnątrz nie robi żadnej różnicy ...)
I pojawia się ten błąd:
java.lang.LinkageError: loader constraint violation: loader (instance of org/springframework/context/support/ContextTypeMatchClassLoader$ContextOverridingClassLoader) previously initiated loading for a different type with name "my/project/formula/FormulaKey"
Zastanawiam się, dlaczego pojawia się ten błąd. Szczególnie irytuje mnie typ FormulaKey
. Kiedy używam adnotacji @Autowired
z innym komponentem bean, to działa.
Muszę wspomnieć, że zaimplementowałem GenericFormulaFactory jako singleton metodą getInstance
. Może to powoduje pewne problemy?
Aplikacja jest samodzielną aplikacją. Sprawdziłem również wszystkie słoiki pod kątem obłudy i nie zakładam, że to jest przyczyna problemu, ponieważ błąd dotyczy moich własnych klas.
Pozdrawiam, Oliver
UPDATE: usunąłem błąd, nie wiedząc, czego przyczyną tego.
Co zrobiłem:
- Usuń metodę getInstance() i singleton charakter wykonania fabrycznego
- Dodano interfejs fabryki do konstruktora klasy Wózek (i
constructor-arg
w XML)
Teraz mogę użyć xml, aby skonfigurować implementację i używać jej również z adnotacjami @Autowired
.
xml:
<bean id="formulaHandler" class="my.project.formula.impl.DefaultFormulaHandler">
<constructor-arg ref="formulaFactory" />
</bean>
<bean id="formulaFactory" class="my.project.formula.impl.GenericFormulaFactory" />
Wciąż zastanawiasz się, dlaczego błąd pojawił się w pierwszej kolejności. Podczas implementacji fabryki, HashMap
został utworzony przy użyciu FormulaKey
jako klucza, więc może to spowodowało problemy. Jeśli ktoś zna odpowiedź, naprawdę chciałbym to wiedzieć.
Nadal wywołujesz 'GenericFormulaFactory.getInstance()' w konstruktorze 'DefaultFormulaHandler'? – Santosh
@Santosh: Tak, tak było. Teraz jest wstrzykiwany. – 4thfloorstudios
Oznacza to, że klasa 'my.project.formula.FormulaKey' nie jest już ładowana w czasie, gdy kontener sprężyny ładuje ziarna. – Santosh