web-dev-qa-db-ja.com

AspectJは何に適していますか?

最初に、AspectJを使用していますが、気に入っていますが、他に何ができるのでしょうか。

AspectJはロギングに使用できます。場合によっては、トランザクション制御に使用されます。主に注釈と組み合わせて実装されます。 AspectJは、Spring Rooが行うように、(コード生成された)メソッドでクラスを拡張するためにも使用できます。

しかし、AspectJとAOPは一般に、ロギング、トランザクション制御、シミュレーションの部分クラス以外にも使用できると思います。

AspectJとAOPの他の有用なユースケースは何ですか?

41
Ralph
  • 権限チェック
  • 時間がかかりすぎる割り込みアクション
  • 別のスレッドで、または他のマシンの異なるプロセスやイベントのコンテキストでアクションを実行する
  • モニタリング
  • 呼び出し前にデータ/環境を準備し、呼び出し後に結果を処理する
  • リソースを開く/閉じる

編集する

この回答を書いてから長い年月が経ちましたが、回答をより完全なものにするために、以下を追加することにしました。

  • セキュリティーチェック。
  • 変更できないAPIの不正または動作の修正。たとえば、一部の条件ではfalseを返すがtrueを返す必要があるブールメソッド。 AspectJを使用してこれを修正できます。
35
AlexR

Wikipediaエントリ は、さらにいくつかの例を示します(ただし、それほど多くはありません)。通常、アスペクト指向プログラミングは、クラスの主要な関心事の一部ではなく、さまざまなクラスに共通する単純な動作を実装するためにのみ使用する必要があります。アスペクトにあまりにも多くのロジックを入れ始めるとすぐに、コードは本当に読めなくなります。

提案する側面(ログ、トランザクションなど)が最も一般的に使用されます。セキュリティも追加します。

19
Guillaume

AspectJを使用して、いくつかの(設計)ルールを適用できます。

  • すべてのコントローラーメソッドが特別なアノテーションを必要とするように
  • すべてのservice/frontend/dtoクラスは、service/fronten/dtoパッケージに配置する必要があります
  • より成熟したものは次のように考えています: セッターにロジックがないことを確認する

Newを使用して新しいインスタンスを作成するクラスにモックを挿入します。次のコードがあるとします。

_public void sendInvitationEmail(String address) {
    InvitationEmail email = new InvitationEmail();
    email.sendTo(address).send();
}
_

emailをモックに置き換える必要があります。次に、アスペクト(@Pointcut("call(InvitationEmail.new(..))"))を使用してモックを「挿入」できます。 -@See Blog JMock and AspectJ by Daniel Roop、およびSpring Rooの@MockStaticEntityMethods( Spring Aspectを使用した静的メソッドのモック

5
Ralph