AspectJ とこのaspectjスクリプトライブラリのオープンソース拡張機能に関する最後のプログラミング 関連 記事で始まったトピックを続けます。 この記事では、この方法論の支持者の間で最も有名なライブラリの例と構文を使用して、アスペクト指向プログラミング(AOP)が解決するタスクを検討します。 AspectJはXerox PARCの子供で、現在は大人であり、Eclipse Foundationに住んでいます。
(修復に関するラークモアの記事の写真)
おそらく、この記事は仕事でAOPを頻繁に使用し、それが何であるかを理解している人にとっては興味深いものではないでしょう。 コメントは建設的なコメントと楽しいホリバーの両方を歓迎します!
免責事項:私は理論家ではありません。したがって、記事で述べられたことは主観的であり、経験のプリズムを通過しました。
オブジェクト指向プログラミングがあるのに、なぜこれらすべての困難、システム設計への異なるアプローチが必要なのでしょうか? 新しい構文、いくつかの側面、スライス(ポイントカット)-すべてが最終的にjvmによって実行される同じ命令に変わるためです。
問題は、開発の容易さ、変更の容易さ、テスト、およびシステムの保守コストです。 アスペクトは、アプリケーションでのオブジェクトモデルの使用と矛盾しない、プログラムの開発および設計における別のパラダイムであるOOPプログラムへの追加です。 すぐに思い浮かぶのは、音声データの分析です。 元の信号を含む時間領域では、処理と分析を実行することは困難です。 しかし、周波数表現に変換すると、特定の周波数のノイズを除去したり、メロディーの音を強調したり、声の音を増幅したりするのが簡単になります。 また、アスペクトを使用すると、プログラムの別の表現で多くのタスクを簡単に操作でき、アスペクトとしてエンドツーエンドの機能を強調できます。 AOPは、巧妙に使用することで、「混乱した」プログラムコードを「解明」するのに役立ちます。
アプリケーションのビジネスロジックからログ操作(ログ)および処理システムエラーの指示を削除し、定型コードの数を減らし、クラスの特定のメソッドまたはフィールドにアクセスする際のユーザーアクセス権を確認し、データベーストランザクションを宣言的に管理し、インストルメンタルプロファイリングを実行する機会があります呼び出しの事実と操作の実行時間だけでなく、コンテキスト、ビジネスロジックの「重い」操作のキャッシングを考慮したコードセクション 副作用がない場合は、特定の種類のオブジェクトを構築するプログラムの場所を検索します。 これは、AOPが便利な唯一のリストではありません。 たとえば、作業中のプロジェクトでは、アスペクトを適用して、分散アプリケーションをテストし、その中のメトリックを収集し、Oracle jdbcドライバーとネットワーク相互作用内のデータベースエラーとタイムアウトをシミュレートします。
AspectJのアドバイスの概念から始めましょう-これは、アスペクトがコードカット(pointcut)に適用される方法です:スライスの前(BEFORE)、成功後(AFTER)、成功後(AFTER RETURNING)、スライスポイントでエラーが発生した場合(AFTER THROWING) )、またはスライスのソースコードを呼び出し、スライスポイントでパラメーターを渡し、実行エラーを処理する必要がある状況を完全に制御します(AROUND)。
ポイントカットまたはスライスは、ソースプログラムのどこにアスペクトを埋め込むかの説明です。 構文は非常に豊富で 、カットオフポイントを定義する複雑なルールを記述することができます。 たとえば、オブジェクト構築、静的初期化ブロック、コンストラクター呼び出し、オブジェクトフィールドへの読み取り/書き込みアクセス、オブジェクト構築、キャッチブロック、注釈付きメソッド、特定タイプのパラメーター付きメソッド呼び出し、マスクごとのメソッド名など。 +ポイントカット構文の論理演算。 もちろん、プログラミングには魔法がありません。これは、バイトコードでインラインであり、ポイントカットで利用できないものに制限を追加します。 また、考えられるすべてのカットオフポイントを宣言的に指定できるわけではないため、アスペクトの実装コード内の呼び出しコンテキストの分析が必要になる場合があります。
アスペクトの結合ポイントパラメータを使用すると、引数の値を取得したり、スライス内でアスペクトが実際に発生した場所を見つけたり、このオブジェクトを取得したりできます。 AROUNDアドバイスの場合、すぐに実際の呼び出しを行い、そのパラメーターを変更して戻り値を取得するか、エラーを処理できます。
AspectJで一見魔法のように見えるすべてのものは、プロジェクトのビルド中にプラグインによって(バイトコードに織り込む)、またはクラスの読み込み中にプログラムコードバイトを変更することによってJavaエージェントによって実装されます(ロード時織り)。 AspectJは、巨大なコミュニティ、多くの出版物、優れたドキュメント、非常に安定した、さまざまなビルドシステムへの統合、Springへの統合、IDEでの優れたサポートを備えた成熟したAOPフレームワークです。
aspectj-scripting(エージェントのAspectJ java拡張)では、アスペクトが実行時にMavenリポジトリからクラスをロードし、ファイルとクラスパスだけでなくhttpサーバーからもエージェント構成を読み取ることができます。 これは、分散Javaアプリケーションのテスト、プロファイリング、および変更に大いに役立ちます。 コードはgithubで利用可能で、エージェントは中央リポジトリにあります 。 以前の出版物では、このライブラリを使用して Mavenプラグインの動作を変更しましたが、実際にアスペクト指向プログラミングを使用する他の例については、以下の記事で説明します。
ケーキの桜がそれを飾ってより美味しくするのと同じように、オブジェクト指向プログラムでのアスペクト指向プログラミングと同じ方法で、開発、修正、テストが簡単になります。 プロジェクトでAOPを使用することに夢中にならないことが重要です-チェリーのソースパンにクリームスプーンを乗せないようにするためです!