2009-07-01 14 views
2

SpringAOPを使用して、behavoirをオブジェクトに挿入しようとしています。ターゲットオブジェクトには、この新しい動作のジョインポイントである単一のメソッドがあります。このメソッドには、ほかに無関係なコードから読み込めるようにするためのカスタムアノテーションもあります。私のクラスはインターフェイスを実装していないので、SpringはCGLIBを使ってターゲットオブジェクトを動的にサブクラス化しています。生成されたサブクラスは元のクラスに注釈が追加されていないようです。SpringAOP生成の動的サブクラスに注釈がありません

@Inherited注釈を運のないカスタム注釈に追加しようとしました。 @Inheritedはクラスにのみ適用されます。これは、Springがサブクラスのオーバーライドされたメソッドにアノテーションを明示的に適用する必要があることを示しています。

EDIT:私は回避策と問題の詳細を見つけました。 CGLibの人々がこの問題を認識しているようです。アノテーションはJavaの実装のように扱われます(メソッドシグネチャの一部というよりはむしろ)。メソッドをオーバーライドすると、アノテーションを再宣言する必要があります。 CGLibはこれをしません(意図的に物事の音によって)。

私のリフレクションロジックを変更することで回避することができました。私が渡されたクラスの注釈付きメソッドを検索していたところで、クラスを見るとスーパークラスです。私は、スーパークラス(プロキシの場合)を使用してメソッドを見つけることになりますが、メソッドを呼び出すと、通常のポリモーフィズムが適用されます。これはいくつかの醜い反射コード(通常よりも醜い)になります。私のコードでSpringAOP実装の詳細を補う必要はないはずです。

これを処理するには、Springがよりクリーンな方法を提供するはずです。誰かが他の提案をしている場合、彼らは評価されるでしょう。

+0

私はSpringフォーラムでこれを尋ねることをお勧めします。 – skaffman

答えて

0

注釈にRetentionPolicyをRUNTIMEに設定してもよろしいですか?

+0

はい。注釈は、私のAspectがクラスに適用されていない場合(つまり、CGLibサブクラスがない場合)に見つけることができます。 –

関連する問題