0

アスペクトで注釈が付けられた私のSpringコントローラーでは、CGLibプロキシを削除し、それらをJDK動的プロキシに置き換えようとしています。JDK動的プロキシはインターフェースでのみ機能するため、クラスがインターフェースを実装しない場合、Spring AOPはCGLibを使用することを知っています。また、インターフェースと実装クラスの両方に注釈が存在する必要があることも認識しています。しかし、私が直面している問題は、コントローラーが JDK プロキシーを持つ Bean として表示されなくなったことです。

私のコントローラ Bean は次のようにスキャンされます。

<context:annotation-config/>
<context:component-scan base-package="com.package.name"/>

これは機能しますが、コントローラーは CGLibController$$EnhancerByCGLIB$$5f0b2287 として表示されます。

package com.package.name;
@Controller
public class CGLibController {
  @AOP_Aspect
  @RequestMapping("some_url")
  public void foo();
}

//in a bean post processor
//in postProcessAfterInitialization(Object bean, String beanName)
  Controller controller = AnnotationUtils
      .findAnnotation(bean.getClass(), Controller.class);
//controller will exist
//bean name is CGLibController$$EnhancerByCGLIB$$5f0b2287

これは機能しません。Bean ポスト プロセッサに到達することはありません。

package com.package.name;
@Controller
public interface ITest{
  @AOP_Aspect
  @RequestMapping("some_url")
  public void foo();
}

package com.package.name;
@Controller
public class DynamicController implements ITest{
  @AOP_Aspect
  @RequestMapping("some_url")
  public void foo();
}

ただし、この DynamicController Bean を次のように明示的に作成すると、

<bean class="com.package.name.DynamicController"/>

次に、サーバーを起動すると、ServletContext が不平を言います

Bean の初期化に失敗しました。ネストされた例外は java.lang.IllegalStateException です: ハンドラー 'dynamicController' を URL パス [some_url] にマップできません: タイプ [クラス $Proxy61] のハンドラーが既にマップされています。

ここで何かが起こっています。DynamicController は動的プロキシです。しかし、他に何が起こっているのかはわかりません。もはや Bean/Controller ではないことはわかっています。「コントローラー、アスペクト、動的プロキシー: 任意の 2 つを選択」は必要ありません。3 つすべてが必要です。これはどういうわけか可能ですか?

4

2 に答える 2

0

このBeanを取得するには、以前のようにpostProcessAfterInitializationではなくpostProcessBeforeInitializationで処理する必要がありました。初期化するとプロキシされ、何かを台無しにするのではないかと思います。

私が示唆したように、DynamicControllerは実際にはJDK動的プロキシですが、プロキシの背後にある実際のオブジェクトはBeanです。でも!私が失ったいくつかの情報源によると、プロキシとインターフェースへのプログラミングを使用する場合、注釈はインターフェース上になければなりません。インターフェイスにそれらがなければ、春は知りません。また、Beanポストプロセッサが機能するには、アノテーションが具象クラス上にある必要があります。インターフェイスだけでは不十分です。

于 2012-12-12T19:28:52.503 に答える
0

あなたの BeanPostProcessor が何をしようとしているのか、またはその中のコードを制御しているかどうかは 100% わかりませんが、それは Ordered ではなく、したがってプロキシが作成された後に処理されていると想定しても安全だと思われます (これはデフォルトは最も低い優先度ですが、順不同の前です)。おそらく、Ordered を実装して低い順序 (0 など) を指定できますか?

于 2012-12-11T15:36:07.687 に答える