Spring java.lang.LinkageError:加载程序约束冲突:加载程序先前启动了对名为X的其他类型的加载

Spring java.lang.LinkageError:加载程序约束冲突:加载程序先前启动了对名为X的其他类型的加载,java,spring,Java,Spring,我不熟悉Spring并使用Spring 3.2.2。我通过注入了一些豆子,效果很好。现在我想通过@Autowired注入一些bean,但完全出了问题。我已经这样做了: beans.xml: <context:annotation-config /> <bean id="formulaFactory" class="my.project.formula.impl.GenericFormulaFactory" factory-method="getInstance">

我不熟悉Spring并使用Spring 3.2.2。我通过
注入了一些豆子,效果很好。现在我想通过
@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.lang.LinkageError:加载程序约束冲突:加载程序(org/springframework/context/support/ContextTypeMatchClassLoader$ContextOverridingClassLoader的实例)先前启动了名为“my/project/FormulaKey/FormulaKey”的不同类型的加载。

我想知道为什么会出现这个错误。尤其是类型
FormulaKey
让我恼火。当我将
@Autowired
注释与其他bean一起使用时,它可以工作

我必须提到,我通过
getInstance
方法将GenericFormulaFactory实现为单例。也许这会引起一些问题

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

问候,, 奥利弗

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

我所做的:

  • 删除工厂实现的getInstance()方法和单例特性
  • 将工厂接口添加到处理程序类构造函数(以及xml中的
    constructor arg
  • 现在,我可以使用xml来配置实现,并将其与
    @Autowired
    注释一起使用

    xml:

    
    

    仍然想知道为什么首先会出现错误。在工厂的实现中,使用
    FormulaKey
    作为键创建了一个
    HashMap
    ,因此这可能会造成麻烦。如果有人知道答案,我真的很想知道。

    以下是我目前能收集到的信息:

  • 错误
    java.lang.LinkageError
    出现在加载类时涉及两个类加载器的情况下
  • 类加载器通过生成包含完全限定类名本身和加载它的类加载器的唯一标识符来跟踪加载的类
  • 当一个类加载器接收到另一个类加载的一个类的引用,而这个类本身已经加载了,这将导致错误的情况,因为一个类在类加载层次结构中只能加载一次
  • 当涉及自定义类加载器时,为了加载特定的类,实践是首先查询父类加载器(如果该类已经加载)
  • 在该场景中,当自定义类加载器不查询父层次结构并决定加载类本身时,可能存在这样的情况,即正在加载的类已经由父层次结构中的某个类加载器加载
  • 阅读《基辅》,弗兰克想了解更多
  • 对于您的情况,我想XML配置和注释处理是由两个不同的类加载器完成的
  • 在错误场景中,
    my.project.formula.FormulaKey
    由一个类加载器加载,然后参与注释处理的类加载器再次加载它
  • 更改代码时,
    my.project.formula.FormulaKey
    的加载会延迟,因为从XML加载上下文时不再引用它

  • 你还在调用
    DefaultFormulaHandler
    constructor中的
    GenericFormulaFactory.getInstance()
    。现在它被注入。这意味着当类
    my.project.formula.FormulaKey
    在spring容器加载bean时不再加载。???我不理解你的评论。从错误消息中,我假设先前加载了
    ContextOverridingClassLoader
    ,但这到底是个什么问题呢?感谢您的研究!我可以补充一点,由于我自己的工厂单例实现,
    FormulaKey
    类似乎在启动应用程序时被加载,然后又被
    @Autowire
    注释加载。通过将单例初始化移到Spring(以及类加载),问题似乎得到了解决,因为Spring可以处理所有的类加载。是的。这似乎就是发生的事情。
    @Autowired
    @Qualifier("formulaFactory")
    private FormulaFactory formulaFactory;
    
    <bean id="formulaHandler" class="my.project.formula.impl.DefaultFormulaHandler">
        <constructor-arg ref="formulaFactory" />
    </bean>
    <bean id="formulaFactory" class="my.project.formula.impl.GenericFormulaFactory" />