web-dev-qa-db-ja.com

@Transactionalはどこに配置しますか?インターフェースの仕様や実装では?

@Transactionalアノテーションを配置する際のベストプラクティスとは何ですか。インターフェースメソッドまたは実装に注釈を付ける必要がありますか?

52
John Manak

良い質問。私はいつもそれを実装に入れてきました。おそらくそれは抽象化ではなく実装の詳細であるためです。

異なる実装に異なるトランザクション動作を持たせたい場合があります。

El Guapoは、それに加えて、プロキシ戦略に関連して、インターフェースを配置することから発生する可能性のある問題が他にもあると指摘しました。

32
Bozho

私の意見では、それは本当にあなたのアプリケーションアーキテクチャに依存しています。これは、クラスをプロキシする方法によって異なります。アプリをproxy-target-class='true'に設定している場合(アプリケーションコンテキストでは、インターフェイスに注釈を付けても@Transactionalの情報は取得されません。

詳細は The Spring Docs-"Tips" をご覧ください。

Springでは、インターフェースに注釈を付けるのではなく、@ Transactional注釈を使用して具象クラス(および具象クラスのメソッド)にのみ注釈を付けることをお勧めします。 @Transactionalアノテーションをインターフェース(またはインターフェースメソッド)に配置することは確かに可能ですが、これはインターフェースベースのプロキシを使用している場合に期待どおりに機能します。 Java注釈がインターフェースから継承されないという事実は、クラスベースのプロキシ(proxy-target-class = "true")またはウィービングベースのアスペクト(mode = " aspectj ")の場合、トランザクション設定はプロキシおよびウィービングインフラストラクチャによって認識されず、オブジェクトはトランザクションプロキシにラップされません。これは明らかに悪いことです。

44
El Guapo

多くの場合、トランザクション管理は実装の詳細ですが、インターフェイスの詳細でもあります。たとえば、アプリケーションのサービスのインターフェースを定義するときは、@Transactionalインターフェイス定義に挿入して、使用している伝播戦略を具体的に明確にします。

1
oiavorskyi

私のシステムではインターフェイスを使用していません。これまでのところ、それを介して何かを実装することが可能かどうかは本当にわかりません。したがって、実装に注釈を付け、Springによってすべてが正しくなると私は信じています。

すべてのクラスがインターフェースを持つ必要があるとは思いません。私は多くのパターンを持つ多くのアーキテクチャを見回し、それらはすべてインターフェースを愛しています。しかし、質問:Springアノテーションをインターフェイスに配置し、何らかの理由で、このインターフェイスを介して実行される実装クラスのトランザクションに別のアプローチが必要な場合、それはできませんでした。それとも私は間違っていますか?

乾杯。