1

spring 4.0.7 では、次の状況を考慮してください。

Eclipselink の場合、load-time-weaver を使用します。そのため、@EnableSpringConfigured と @EnableLoadTimeWeaving を同時に使用して、Springs @Configurable アノテーションを試してみました。

これは完全に機能し、Spring-Bean は構築中に POJO に完全に注入されます。これらの POJO の検証に関するコードを Bean の他の場所ではなく、これらの内部に保持したいので、この機能は役に立ちます。

Spring コンテキストの一部には、一部のパッケージにローカルであり、そこでのみ使用されるため、インターフェイスを実装しない Bean が含まれています。たとえば、FooLogicBean はその 1 つです。これが別の Bean に注入され、何らかのパフォーマンス測定アスペクトのような Spring-AOP-Aspect (not-aspectj) が実行パスにある場合、Spring は FooLogicBean の CGLIB 自動プロキシを作成し、それを注入します。これは完全に機能し、完璧に機能します。

FooLogicBean ( fooLogicBean.doValidate(myPojo); など) のメソッドのパラメーターとして @Configurable でアノテーションが付けられた POJO を実際に使用したい場合、それぞれ CGLIB プロキシとして問題が発生します。この場合、いくつかの重要な魔法が、その POJO がアスペクト j (Spring-aspects の AnnotationBeanConfigurerAspect) を介して織り込まれるのを阻止します。前述の doValidate() メソッドの呼び出しに関係なく、コードのどこにも織り込まれることはありません。

その POJO を FooLogicBean 内に作成するが、それをメソッド パラメーターとして使用しない場合、@Configurable により再び織り込まれます。

Autoproxy 作成コードを知らなくても、そのクラスが既に spring-aop で使用されている場合、なんらかの派手なマーキングルーチンが、aspectj によってクラスが検出されるのを妨げていると想定します。この場合のuseはAccessを意味します。

そのようなあいまいな星座で実験し、その解決策を知っている人はいますか?

前もって感謝します!

4

1 に答える 1

1

プロキシは、サブクラス化によって作成されます。つまり、注釈付きクラスのプロキシを作成すると、次のようになりますFoo

class Foo {
  @Bar
  void bar() { }
}

プロキシは、クラスを実装することによって作成されます

class Foo$Proxy extends Foo {
  @Override
  void bar() { 
    // Proxy logic
  }
  // Overridden methods of Object
}

これにより、Foo$Proxyクラスは の有効なLiskov 代替になりFooます。@Barただし、通常のオーバーライド セマンティクスが適用されます。つまり、オーバーライドされたメソッドにはもはや存在しないなどの継承されないアノテーションです。別の注釈ベースの API が Bean を処理すると、すべての注釈が消えて結果につながります。これは、あらゆる種類の注釈に当てはまります。型、メソッド、およびメソッド パラメーターに関するもの。

しかし、それは避けられますか?これは、最近作成され、アノテーションとは何かを理解して構築されたプロキシ ジェネレータを使用することによるものであることが最も確実です。これは、Java 仮想マシンの初期に最初に出荷された cglib には当てはまりません。ただし、Spring が cglib から離れない限り、今日の制限を受け入れなければなりません。

于 2014-09-17T08:32:25.407 に答える