Spring java.lang.LinkageError:loader constraint violation:loader以前为名为X的其他类型启动加载
我是Spring新手并使用Spring 3.2.2。 我有一些我通过注入的bean工作正常。 现在我想通过
@Autowired
注入一些完全出错的bean。 我这样做了:
beans.xml中:
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
类型FormulaKey
我感到恼火。 当我将@Autowired
注释与其他bean一起使用时,它可以工作。
我必须提到我通过getInstance
方法将GenericFormulaFactory实现为singleton。 也许这会导致一些问题?
该应用程序是一个独立的应用程序。 我也检查了所有jar子的双重性,我不认为这是问题的原因,因为错误与我自己的类有关。
此致,奥利弗
更新:我删除了错误,而不知道是什么原因造成的。
我做了什么:
- 删除工厂实现的getInstance()方法和单例性质
- 将工厂接口添加到处理程序类构造函数(以及xml中的
constructor-arg
)
现在我可以使用xml配置实现并将其与@Autowired
注释一起使用。
XML:
仍然想知道为什么错误首先出现。 在工厂的实现中,使用FormulaKey
作为键创建了HashMap
,因此可能会造成麻烦。 如果有人知道答案,我真的很想知道。
这是我到目前为止可以收集的内容:
- 错误
java.lang.LinkageError
出现在加载类时涉及两个类加载器的情况。 - 类加载器通过生成唯一标识符来跟踪加载的类,该标识符包含完全限定的类名本身以及加载它的类加载器。
- 当类加载器接收由另一个已经加载的类加载的类的引用时,这会导致错误的情况,因为类只能在类加载层次结构中加载一次。
- 当涉及自定义类加载器时,为了加载特定类,实践是如果已经加载了该类,则首先查询父类加载器。
- 在该场景中,当自定义类加载器不查询父层次结构并决定加载类本身时,可能存在这样的情况:正在加载的类已经由父层次结构中的某个类加载器加载。
- 请点击此链接了解更多相关信息。
- 对于您的情况,我猜XML配置和注释处理由两个不同的类加载器完成。
- 在错误场景中,
my.project.formula.FormulaKey
由一个类加载器加载,然后注释处理中涉及的类加载器再次加载它。 - 当您更改代码时,
my.project.formula.FormulaKey
的加载将延迟,因为从XML加载上下文时不再引用它。