我是 Spring 新手并使用 Spring 3.2.2。我有一些注入的豆子,<constructor-arg>
效果很好。现在我想注入一些@Autowired
完全出错的bean。我已经这样做了:
豆类.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 实现为单例。也许这会导致一些问题?
该应用程序是一个独立的应用程序。我也检查了所有 jar 的重复性,我不认为这是问题的原因,因为错误与我自己的类有关。
问候,奥利弗
更新: 我在不知道是什么原因的情况下删除了错误。
我做了什么:
- 移除工厂实现的 getInstance() 方法和单例性质
- 将工厂接口添加到处理程序类构造函数(以及
constructor-arg
在 xml 中)
现在我可以使用 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" />
仍然想知道为什么首先出现错误。在工厂的实现中,aHashMap
是使用FormulaKey
as 键创建的,所以这可能会造成麻烦。如果有人知道答案,我真的很想知道。