13

私はSpringが初めてで、Spring 3.2.2を使用しています。私は正常に動作するように注入したいくつかの豆を持ってい<constructor-arg>ます。今、私はビーンを注入したかったのですが、@Autowiredそれは完全にうまくいきませんでした。私はこれをしました:

ビーンズ.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 で使用すると、機能します。

GenericFormulaFactory をgetInstanceメソッド経由でシングルトンとして実装したことを言及する必要があります。多分それはいくつかの問題を引き起こしますか?

アプリケーションはスタンドアロン アプリです。すべての jar の重複もチェックしましたが、エラーは自分のクラスに関連しているため、これが問題の原因であるとは思いません。

よろしく、 オリバー

更新: 原因がわからないままエラーを削除しました。

私がしたこと:

  1. ファクトリ実装の getInstance() メソッドとシングルトンの性質を削除します
  2. ファクトリー・インターフェースをハンドラー・クラスのコンストラクター (およびconstructor-argxml)に追加しました

これで、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いたので、これが原因だったのかもしれません。誰かが答えを知っているなら、私は本当にそれを知りたいです.

4

1 に答える 1

36

これまでに収集できたものは次のとおりです。

  1. このエラーjava.lang.LinkageErrorは、クラスのロードに 2 つのクラスローダーが関与している場合に発生します。
  2. クラスローダーは、完全修飾クラス名自体とそれをロードしたクラスローダーを含む一意の識別子を生成することにより、ロードされたクラスを追跡します。
  3. クラスローダが、それ自体ですでにロードされている別のクラスによってロードされたクラスの参照を受け取ると、クラスローディング階層でクラスを一度しかロードできないため、これは誤った状況になります。
  4. カスタム クラスローダーが関係する場合、特定のクラスをロードするために、そのクラスが既にロードされている場合は、親クラスローダーが最初にクエリされます。
  5. このシナリオでは、カスタム クラスローダーが親階層にクエリを実行せず、クラス自体をロードすることを決定した場合、ロードされるクラスが親階層の一部のクラスローダーによって既にロードされている場合があります。
  6. 詳細については、Frank の Kieviet のThe java.lang.LinkageError: loader constraint violation" demystifiedを参照してください。
  7. あなたの場合、XML 構成と注釈処理は 2 つの異なるクラスローダーによって行われると思います。
  8. エラー シナリオでmy.project.formula.FormulaKeyは、 が 1 つのクラスローダーによってロードされ、その後、注釈処理に関与するクラス ローダーがもう一度ロードします。
  9. コードを変更するmy.project.formula.FormulaKeyと、 XML からコンテキストをロードしている間は参照されなくなるため、 のロードは延期されます。
于 2013-08-19T13:43:06.420 に答える