3

Springのトランザクション管理機能を利用してトランザクションを実装したい。しかし、どちらが優れているかはわかりません(AOPと@Transactional)。両方の機能は正しく動作しますか? 開発効率に違いはありますか?


(追加) ここで AOP は「@Transactional アノテーションを明示的に使用せずに AspectJ を使用する」ことを意味します


(追記)annotation-configとXM​​Lベースの設定の違いが知りたい

4

1 に答える 1

3

私はこれを自分で疑問に思いました。Spring フォーラムで、このトピックに関する適切な議論を見つけました。

以下に、前述のリンクからの私の見解を要約します。

AOP トランザクション境界

利点:

  • Java コードには、代わりに構成ファイルのコードの外側に含まれるトランザクション構成がありません
  • Java コードは Spring ライブラリに直接依存していません
  • トランザクション管理は 1 か所に集中
  • 簡単に変更できないソース コードにトランザクション境界を適用できる

欠点:

  • AOP の複雑さ。コードだけでは、トランザクションの境界がどこにあるかは明確ではなく、開発者は、たとえば、ポイントカットが適用されるメソッド シグネチャを変更することによって、トランザクションを誤って壊してしまう可能性があります。
  • トランザクション境界を適用するために 2 つの場所 (ソース コードと AOP 構成) に触れる必要がある

@Transactional春の注釈

利点:

  • ソースコードを調べると、トランザクションの境界がより明確に理解されます

欠点:

  • Java コードはトランザクション宣言と結合されます (ただし、メタデータ レベルのみですが、Spring のインポートが必要です)。

この議論は、JPA アノテーションと JPA XML 構成の違いを思い出させます。XML ベースの JPA 構成では、エンティティーは「よりクリーン」になりますが、分離は努力する価値がありますか? それとも、分離は有害なのでしょうか (Java ソース ファイルを開いて、 @Entity アノテーションに基づいて、そのクラスが EJB であることがすぐにわかると便利です)。実際には、ほとんどの開発者が JPA アノテーションの使用を選択しているように思えます。ただし、この場合は とは異なり@Transactional、jpa アノテーションは標準であるため、いくつかの懸念を緩和するのに役立つ場合があります。

そうは言っても、Spring の AOP 構成を使用して Struts2 (Webwork) インターセプターにアノテーションを付けて、リクエストごとに 1 つのトランザクションを許可するプロジェクトに参加しましたが、これはうまくいきました。この場合、サービス レイヤーや他の場所でのトランザクション境界について特に心配する必要はありませんでした。すべてが既にトランザクションに参加しており、インターセプターがトランザクションを閉じる前にビューがレンダリングされたため、OpenSession/EntityManagerInViewソリューションを適用する必要はありませんでした。

于 2013-09-23T20:11:28.237 に答える