我是Spring新手并使用Spring 3.2.2。我有一些豆子,我通过<constructor-arg>
注入,工作正常。现在我想通过@Autowired
注入一些完全出错的bean。我这样做了:
beans.xml中:
<context:annotation-config />
<bean id="formulaFactory" class="my.project.formula.impl.GenericFormulaFactory"
factory-method="getInstance">
<qualifier value="formulaFactory"></qualifier>
</bean>
Java源代码:
@Autowired
@Qualifier("formulaFactory")
private FormulaFactory formulaFactory;
(更改限定符或将其删除没有任何区别......)
我收到了这个错误:
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"
我想知道为什么会出现这个错误。特别是类型FormulaKey
让我感到恼火。当我将@Autowired
注释与其他bean一起使用时,它可以工作。
我必须提到我通过getInstance
方法将GenericFormulaFactory实现为单例。也许这会导致一些问题?
该应用程序是一个独立的应用程序。我也检查了所有罐子的双重性,我不认为这是问题的原因,因为错误与我自己的类有关。
此致 奥利弗
更新 我在不知道是什么原因的情况下删除了错误。
我做了什么:
constructor-arg
)现在我可以使用xml配置实现并将其与@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" />
仍然想知道为什么这个错误首先出现了。在工厂的实施过程中,使用HashMap
作为密钥创建了FormulaKey
,因此可能会造成麻烦。如果有人知道答案,我真的很想知道答案。
答案 0 :(得分:21)
到目前为止,我可以收集到这些内容:
java.lang.LinkageError
出现在加载类时涉及两个类加载器的情况。 my.project.formula.FormulaKey
由一个类加载器加载,然后注释处理中涉及的类加载器再次加载它。my.project.formula.FormulaKey
的加载被推迟,因为从XML加载上下文时不再引用它。