ホームページ > 記事 > ウェブフロントエンド > アスペクト指向プログラミング (AOP)_JavaScript スキルの理解
従来のビジネス ロジック処理コードを作成する場合、通常、ログ記録、トランザクション制御、権限制御などのいくつかのことを習慣的に実行してから、コアとなるビジネス ロジック処理コードを作成します。コードを書き終えて振り返ってみると、図 6-4 に示すように、Yangyangshasha の数百行のコードのうち、実際にコア ビジネス ロジックの処理に使用されているのは数行だけであることに気づきました。方法に次ぐ方法、授業に次ぐ授業、無力感と後悔とともに何年も経ちました。それは問題ありませんが、プロジェクトの最後に権限制御に大きな変更が必要であると突然決定された場合、何千ものメソッドを 1 つずつ「訪問」する必要があり、苦痛は「さらに悪化」します。
図 6-4 の多くのメソッドの共通コードをすべて抽出して、集中管理できる場所に配置し、特定の実行時にコンテナがこれらの共通コードを動的に織り交ぜることができれば、少なくとも 2 つの問題は解決できます。 :
特定のビジネス ロジック処理メソッドを作成する場合、Java EE プログラマーはコア ビジネス ロジック処理のみを考慮するだけで済みます。これにより、作業効率が向上するだけでなく、コード変更がシンプルかつエレガントになります。
今後の保守においては、ビジネスロジックコードと共通コードを別々に保管し、共通コードを一元的に保管するため、保守作業がシンプルかつ容易になります。
アスペクト指向プログラミング AOP テクノロジーは、図 6-5 に示すように、ログ アスペクト、パーミッション アスペクト、トランザクション待機アスペクトなどの普遍的な機能を表す断面図です。 。
AOP テクノロジの実装原理を詳しく分析するために、ユーザー管理ビジネス ロジック コンポーネント UserService の AOP 実装プロセス (図 6-6 を参照) を例に挙げてみましょう。 AOP テクノロジは、Java 言語のリフレクション メカニズムと動的プロキシ メカニズムに基づいています。ビジネス ロジック コンポーネントの実行中、AOP コンテナはユーザーが呼び出すためのプロキシ オブジェクトを動的に作成します。このプロキシ オブジェクトは、Java EE プログラマの意図に従ってターゲット メソッドの接続ポイントへのアスペクトを正常に切断します。アスペクトの機能がターゲットメソッドの接続点と一致していること。ビジネスロジックの機能が同時に実行されること。原則として、呼び出し元が直接呼び出すのは、実際には AOP コンテナーによって動的に生成されたプロキシ オブジェクトであり、その後、プロキシ オブジェクトがターゲット オブジェクトを呼び出して元のビジネス ロジック処理を完了します。プロキシ オブジェクトにはアスペクトとビジネス ロジック メソッドが合成されています。
ここで、図 6-6 に含まれるいくつかの概念を以下に説明します。
側面: 実際、これは共通の機能の実現です。ログの側面、権限の側面、トランザクションの側面など。実際のアプリケーションでは、一般的な機能の実装を格納する通常の Java クラスであることが多く、AOP コンテナーによってアスペクトとして認識される理由は構成で指定されます。
アドバイス: アスペクトの具体的な実装です。ターゲットメソッドを基準点として、配置場所の違いにより、事前通知(Before)、事後通知(AfterReturning)、例外通知(AfterThrowing)、最終通知(After)、およびその周囲の5つのタイプに分類できます。通知(アラウンド)。実際のアプリケーションでは、通常はアスペクト クラスのメソッドであり、特定の種類の通知も設定で指定されます。
結合ポイント: プログラムの実行プロセス中にアスペクトを挿入できる場所です。たとえば、メソッドの呼び出し、例外のスロー、フィールドの変更などですが、Spring はメソッド レベルの接続ポイントのみをサポートします。
ポイントカット: 通知がどの接続ポイントにカットされるかを定義するために使用されます。通常、異なる通知は異なる接続ポイントに切り込む必要があります。この正確な一致は、エントリ ポイントの正規表現によって定義されます。
ターゲット: アスペクトに入ろうとしているオブジェクト、つまり通知されるオブジェクトです。これらのオブジェクトにはクリーンなコア ビジネス ロジック コードのみが残され、すべての共通関数コードは AOP コンテナーが割り込まれるのを待っています。
プロキシ オブジェクト (Proxy): 対象オブジェクトに通知を適用した後に動的に作成されるオブジェクト。プロキシ オブジェクトの機能は、ターゲット オブジェクトのコア ビジネス ロジック機能に共通機能を加えたものに等しいと簡単に理解できます。プロキシ オブジェクトはユーザーに対して透過的であり、プログラムの実行プロセスの産物です。
ウィービング: ターゲット オブジェクトにアスペクトを適用して、新しいプロキシ オブジェクトを作成するプロセス。このプロセスは、コンパイル期間、クラスのロード期間、および実行時に発生する可能性があります。当然、発生ポイントが異なれば、前提条件も異なります。たとえば、コンパイル中に発生する場合は、この AOP 実装をサポートする特別なコンパイラが必要です。クラスのロード中に発生する場合は、実行時に発生する場合にのみ AOP 実装をサポートする特別なクラス ローダーが必要です。動的な実装を実現する Java 言語のリフレクション機構と動的プロキシ機構。
以下は補足です:
AOP は Aspect Oriented Programming の略で、アスペクト指向プログラミングを意味します。プリコンパイルと実行時の動的エージェントによってプログラム機能の統一的な保守を実現する技術です。
AOP と OOP は、異なる分野向けの 2 つの設計アイデアです。
OOP (オブジェクト指向プログラミング) は、エンティティとその属性、ビジネス処理プロセスの動作を抽象的にカプセル化して、論理ユニットをより明確かつ効率的に分割します。
AOP は、ビジネス処理プロセスの側面を抽出し、処理プロセスの特定のステップまたは段階を処理して、論理プロセス内のさまざまな部分間の結合度を低くする分離効果を実現します。
AOP と OOP は、上記の文字通りの意味から単純に理解することができ、次のように理解しても過言ではありません:
OOP は実際にはオブジェクトのプロパティと動作をカプセル化したものであり、AOP はこれについて語ることはできませんが、AOP は特定のステップと段階を処理し、それらから複数の論理プロセスを抽出します。反復的な操作動作がある場合、AOP はそれらを抽出し、動的エージェントを使用してプログラム機能の統一された保守を実現できます。これは、許可の判断やロギングなどに関して言えば、暗黙的すぎる可能性があります。単純にOOPを使う場合、許可判定はどうなるのでしょうか?各操作の前に許可判定を追加しますか?ログ記録についてはどうですか?各メソッドの最初、最後、例外にログを手動で追加しますか?したがって、AOP を使用して、プロキシの助けを借りてこれらの繰り返し操作を完了すると、論理プロセス内のさまざまな部分間の結合を減らすことができます。両者は互いの強みを補い合い、補い合います。
AOP の概念についてさらに詳しく見てみましょう:
•側面: 懸念事項のモジュール化。この懸念事項の実装は複数のオブジェクトにまたがる可能性があります。トランザクション管理は、J2EE アプリケーションにおける横断的な問題の好例です。アスペクトは Spring の Advisor またはインターセプターを使用して実装されます。
• ジョインポイント: メソッド呼び出しやスローされる特定の例外など、プログラム実行における明確なポイント。
•通知 (アドバイス): 特定の接続ポイントで、AOP フレームワークによって実行されるアクション。通知には、「周囲」、「前」、「投げ」の通知など、さまざまな種類があります。通知の種類については以下で説明します。 Spring を含む多くの AOP フレームワークは、通知モデルとしてインターセプターを使用し、接続ポイントの「周囲」にインターセプター チェーンを維持します。
•Pointcut: 通知がトリガーされる接続ポイントのコレクションを指定します。 AOP フレームワークでは、開発者が正規表現などを使用してエントリ ポイントを指定できるようにする必要があります。
•はじめに: 通知されたクラスにメソッドまたはフィールドを追加します。 Spring では、推奨されたオブジェクトに新しいインターフェイスを導入できます。たとえば、インポートを使用して任意のオブジェクトに IsModified インターフェイスを実装させ、キャッシュを簡素化できます。
•ターゲット オブジェクト: 接続ポイントを含むオブジェクト。通知されたオブジェクトまたはプロキシされたオブジェクトとも呼ばれます。
•AOP プロキシ: AOP フレームワークによって作成されるオブジェクト (通知を含む)。 Spring では、AOP プロキシは JDK 動的プロキシまたは CGLIB プロキシにすることができます。
•ウィービング: さまざまな要素を組み合わせて、推奨されるオブジェクトを作成します。これはコンパイル時 (AspectJ コンパイラを使用するなど) または実行時に行うことができます。 Spring は、他の純粋な Java AOP フレームワークと同様に、実行時にウィービングを完了します。
Spring の AOP プロキシは Spring の IoC コンテナによって生成および管理され、その依存関係も IoC コンテナによって管理されます。 Spring の AOP がプロジェクトにどのように実装されるかについては、次回のブログでロギングを例として使用して学習します。