1
public interface Service {

  public void doSomething();
}

@Service
public class MyService implements service{

      @Transactional 
      public void doSomething(){
      }
}

@Controller
public class MyController {

  @Autowired
  private MyService service;
}

上記のシナリオでは、自動配線は例外 " illegalArgumentException : argument type mismatch" で失敗します。implements serviceMyService から削除すると、すべて正常に動作します。

自動配線を成功させるためにapplicationContext.xmlでその場所を検索して見つけましたが<aop:aspectj-autoproxy proxy-target-class="true"/>、うまくいきました。@Transactional を使用すると、Spring が JDK プロキシを使用することもわかりました。

戸惑いもありますが、

  1. @Transactional とプロキシの関係
  2. spring がインターフェイスを実装する Bean に JDK Proxy を使用する理由。
  3. <aop:aspectj-autoproxy proxy-target-class="true"/>applicationContext.xmlに配置する必要がある理由

誰でも説明できますか?または記事やブログを参照してください

4

1 に答える 1

1

プロキシは、Spring が宣言型トランザクション管理を実装する方法です。Spring リファレンスは、これに関するすべての質問に最適な場所です。

Spring Framework の宣言型トランザクション サポートに関して把握する必要がある最も重要な概念は、このサポートが AOP プロキシを介して有効になること、およびトランザクション アドバイスがメタデータ (現在は XML またはアノテーション ベース) によって駆動されることです。AOP とトランザクション メタデータの組み合わせにより、TransactionInterceptor を適切な PlatformTransactionManager 実装と組み合わせて使用​​する AOP プロキシが生成され、メソッド呼び出しでトランザクションが駆動されます。

そして<aop:aspectj-autoproxy proxy-target-class="true"/>

要素の proxy-target-class 属性は、 @Transactional アノテーションが付けられたクラスに対して作成されるトランザクション プロキシのタイプを制御します。proxy-target-class 属性が true に設定されている場合、クラスベースのプロキシが作成されます。proxy-target-class が false の場合、または属性が省略されている場合、標準の JDK インターフェイスベースのプロキシが作成されます。(さまざまなプロキシタイプの説明については、セクション8.6「プロキシメカニズム」を参照してください。)

于 2012-12-03T08:39:47.720 に答える