2

インターフェイス@autowireda @component.

私の問題をもう少し説明させてください。インターフェースとその実装クラスの名前は同じですが、それらは異なるパッケージに存在します。として実装に注釈を付けました@Component("myImplementation")。しかし、私は次のような例外があります:

conflicts with existing, non-compatible bean definition of same name and class

からインターフェイスを除外する<context:component-scan ことを考えていますが、どう思いますか?

PS: 私のインターフェイスは@Component注釈が付けられていません。アプリケーションは開発環境で問題なく動作します。Proguard の難読化後にのみエラーが発生します。

4

3 に答える 3

1

proguard.confには以下が含まれている必要があります。

## ... preserve class annontation (Java EE 1.6 DI)
# Spring3
#-keep @org.springframework.stereotype.Service class *
-keep @org.springframework.stereotype.Controller class *
#-keep @org.springframework.stereotype.Component class *
#-keep @org.springframework.stereotype.Repository class *

proguard フォーラムには、より詳細な回答があります。

于 2012-08-28T21:41:55.803 に答える
1

実装に@Componentアノテーションを付けて、インターフェイスにアノテーションを付けないのが、通常、物事をセットアップする正しい方法です。Spring のオートワイヤリングは一致するタイプのマネージド Bean を探し、実装はインターフェースに型指定されたフィールドに一致します。インターフェイスに@Component、または Spring ステレオタイプ アノテーションが付けられていない場合、コンポーネント スキャン中にコンテキストにロードしないでください。したがって、インターフェースと実装が同じクラス名を持っていても問題はないはずです。

インターフェイスに注釈を付けないようにしましたか? インターフェイスとその実装と同じ名前を持つ、プロジェクト内の別の場所に他のクラスがありませんか?

于 2012-04-25T19:29:24.230 に答える
0

インターフェイスのオブジェクト参照を作成し、それぞれの実装 Bean がそれらのオブジェクト参照に自動配線されるため、別のパッケージにインターフェイスを移動するとうまくいくと思います。ただし、命名規則に従う必要があります。名前が同じであるため、インターフェイスと実装クラスを区別すると問題が発生します。のような基準に従ってください

interface SomeInterface {
//....
}

SomeInterface の実装クラス用

class SomeInterfaceImpl implements SomeInterface {
// implementation....
}
于 2012-04-25T15:42:20.347 に答える