Spring java.lang.LinkageError:loader constraint violation:loader以前为名为X的其他类型启动加载

时间:2013-08-08 13:34:12

标签: java spring

我是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实现为单例。也许这会导致一些问题?

该应用程序是一个独立的应用程序。我也检查了所有罐子的双重性,我不认为这是问题的原因,因为错误与我自己的类有关。

此致 奥利弗

更新 我在不知道是什么原因的情况下删除了错误。

我做了什么:

  1. 删除工厂实现的getInstance()方法和单例性质
  2. 将工厂接口添加到处理程序类构造函数(以及xml中的constructor-arg
  3. 现在我可以使用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,因此可能会造成麻烦。如果有人知道答案,我真的很想知道答案。

1 个答案:

答案 0 :(得分:21)

到目前为止,我可以收集到这些内容:

  1. 错误java.lang.LinkageError出现在加载类时涉及两个类加载器的情况。
  2. 类加载器通过生成唯一标识符来跟踪加载的类,该标识符包含完全限定的类名本身以及加载它的类加载器。
  3. 当类加载器接收由另一个已经加载的类加载的类的引用时,这会导致错误的情况,因为类只能在类加载层次结构中加载一次。
  4. 当涉及自定义类加载器时,为了加载特定的类,实践是如果已经加载了该类,则首先查询父类加载器。
  5. 在该场景中,当自定义类加载器不查询父层次结构并决定加载类本身时,可能存在这样的情况:正在加载的类已由父层次结构中的某个类加载器加载。
  6. 关注 this link 以了解详情。
  7. 对于您的情况,我猜XML配置和注释处理由两个不同的类加载器完成。
  8. 在错误场景中,my.project.formula.FormulaKey由一个类加载器加载,然后注释处理中涉及的类加载器再次加载它。
  9. 当您更改代码时,my.project.formula.FormulaKey的加载被推迟,因为从XML加载上下文时不再引用它。