Spring inAction-AOP篇

1.アスペクト指向プログラミングとは何ですか?

  • コンセプト:実行時にプリコンパイルと動的エージェントを介してプログラム機能の統合メンテナンスを実現するテクノロジー。AOPを使用すると、ビジネスロジックのさまざまな部分を分離できるため、ビジネスロジックのさまざまな部分間の結合が減り、プログラムの再利用性が向上し、同時に開発の効率が向上します。

2.AOPの用語

2.1。アドバイス

  • AOPの用語では、アスペクト作業は通知と呼ばれます。
  • 5種類の通知を春の側面に適用できます
    • 通知前(前):ターゲットメソッドが呼び出される前に通知関数を使用します
    • 通知後(後):ターゲットメソッドが完了した後に通知が呼び出されます。この時点では、メソッドの出力は気にしません。
    • 戻り後:ターゲットメソッドが正常に実行された後、通知が呼び出されます
    • スロー後:ターゲットメソッドが例外をスローした後に通知が呼び出されます。
    • Aroud:通知は通知されたメソッドをラップし、通知されたメソッドが呼び出される前後にカスタム動作を実行します。

2.2、カットポイント

  • 通知がアスペクトの「何」と「いつ」を定義する場合、カットポイントは「場所」を定義し、カットポイントの定義は通知が織り込まれる複数の接続ポイントと一致します。通常、明示的なクラス名とメソッド名を使用するか、正規表現を使用して一致するクラス名とメソッド名を定義し、これらのポイントカットを指定します。

2.3。接続ポイント

  • 接続ポイントは、アプリケーションの実行中にアスペクトに挿入できるポイントです。私たちのアプリには、何千ものタイミングアプリ通知もあります、
  • このポイントは、メソッドが呼び出されたとき、例外がスローされたとき、またはフィールドが変更されたときですらあります。アスペクトコードはこれらのポイントを使用して、アプリケーションの通常のフローに挿入し、新しい動作を追加できます。

2.4、セクション

  • アスペクトは、通知とポイントの組み合わせです。通知とポイントカットは一緒になって、アスペクトのコンテンツ全体、つまり、アスペクトが何であるか、どこで、どこでその機能を果たすかを定義します。

3.SpringによるAOPのサポート

3.1。コンセプト

  • アスペクトロックが織り込まれている接続ポイントを定義するポイントカットを作成することは、AOPフレームワークの基本的な機能です。

3.2.Springは4種類のAOPサポートを提供します

  • プロキシに基づくクラシックなSpringAOP(面倒で複雑すぎ、基本的に非推奨)
  • 純粋なPOJOアスペクト(XMLを構成する必要があります)
  • @AspectJアノテーション駆動型アスペクト(アノテーションに基づく)
  • 注入されたAspectJアスペクト(Springのすべてのバージョンに適用可能)
  • 最初の3つはSpringAOP実装の問題です。SpringAOPは動的プロキシに基づいて構築されているため、SpringのAOPのサポートはメソッドインターセプトに限定されています。

3.3、Springは実行時にオブジェクトに通知します

  • Springは、実行時にアスペクトをSpring管理のBeanに織り込み、アスペクトをラップしてターゲットクラスをプロキシクラスにカプセル化し、通知されたメソッドの呼び出しをインターセプトしてから、呼び出しを実際のターゲットBeanに転送します。
  • プロキシがメソッド呼び出しをインターセプトすると、ターゲットBeanを呼び出してメソッドを送信する前に、アスペクトロジックが実行されます。
    ここに画像の説明を挿入します
  • Springは、アプリケーションがBeanをプロキシする必要がある場合にのみプロキシオブジェクトを作成するため、SpringAOPの側面を織り込むための特別なコンパイラは必要ありません。

3.4、Springはメソッドレベルの接続ポイントのみをサポートします

  • Springは動的プロキシに基づいているため、Springはメソッド接続ポイントのみをサポートします。
  • AspectJとJBossは、メソッドポイントカットに加えて、フィールドとコンストラクターのアクセスポイントも提供します。
  • Springはフィールド接続ポイントのサポートが不足しており、オブジェクトフィールドの変更をインターセプトするなど、きめ細かい通知を作成することはできません。

4.カットポイントを介して接続ポイントを選択します

  • カットポイントは、ストアを使用する必要があるアスペクトの通知を正確に特定するために使用されます。通知とその順序は、アスペクトの最も基本的な要素です。
    ここに画像の説明を挿入します
  • 実際には実行インジケーターのみが実行されて一致し、他のインジケーターは一致を制限するために使用されることに注意してください。

4.1、カットポイントを書く

  • アスペクトのカットポイントを定義するためのテーマが必要なので、パフォーマンスインターフェイスを定義します
package concert;

public interface Prformance{
    
    
	public void perform();
}
  • ポイントカット式。この式エージェンシーは、perform()メソッドが実行されたときに通知をトリガーするように呼び出しを設定できます。
    ここに画像の説明を挿入します
  • 一致させる必要のあるポイントカットは、コンサートパッケージにのみ一致するとします。within()インジケーターを使用して、一致を制限できます。
  • &&はandを表し、||はor、!を表します。を表しません。xmlの特殊文字には特別な意味があるため、引き続きxmlでとを使用します。
    ここに画像の説明を挿入します

4.2、カットポイントで豆を選択します

  • Springは、新しいbean()インジケーターも導入しました。これにより、単一の式でBeanIDを使用してBeanを識別できます。
  • ターゲットメソッドが実行されたときに通知を適用したいのですが、BeanIDをウッドストックに制限します。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

5.アノテーションを使用してアスペクトを作成します

5.1、アスペクトを定義する

  • AspectJのアノテーション指向モデルは、任意のクラスを少量のアノテーションを持つアスペクトに簡単に変換できます。
    ここに画像の説明を挿入します
  • ここではアノテーションを使用して通知メソッドを宣言し、カットポイントのターゲットメソッドを通知アノテーションに示します。
  • AspectJは、通知を定義するために5つの注釈を提供します。
    ここに画像の説明を挿入します
  • 上記のアスペクトでは、各アノテーションのポイントカット式をその値として定義し、それが繰り返されることもあります。その後、@ Pointcutアノテーションを使用して、AspectJアスペクトで再利用可能なポイントカットを定義できます。
    ここに画像の説明を挿入します
  • ここで、@ AspectJはアスペクトを示すために使用されますが、それでもPOJOであることに注意してください。他のクラスと同様にそのメソッドを呼び出し、単体テストを実行し、SpringでBeanとしてアセンブルすることもできます。
    ここに画像の説明を挿入します
  • SpringコンテナでBeanとしてのみ定義されている場合、クラスに@AspectJアノテーションが付けられていても、アスペクトとは見なされず、これらのアノテーションは解析されず、アスペクトに変換するプロキシが作成されません。
  • 構成クラスのアノテーション@ EnableAspectJ-AutoProxyを介して自動プロキシ機能を有効にする必要があります。
    ここに画像の説明を挿入します
  • XMLを使用してSpringでBeanをアセンブルする場合は、Spring aop名前空間で<aop:aspectj-autoproxy>要素を使用する必要があります。
    ここに画像の説明を挿入します
  • このように、JavaConfigまたはXMLのどちらを使用する場合でも、AspectJ自動プロキシは@AspectJで注釈が付けられたBeanのプロキシに遭遇し、このプロキシはアスペクトのポイントカットに一致するすべてのBeanを囲みます。

5.2。サラウンド通知を作成します。

  • 周囲の溶質は最も強力な通知タイプです。
  • これにより、作成したロジックで、通知されたターゲットメソッドを完全にラップできます。
    ここに画像の説明を挿入します
  • @Aroudアノテーションは、watchPerformance()メソッドがperformance()カットポイントのサラウンド通知に戻ることを示します。
  • ProceedingJoinPointをパラメーターとして受け入れる必要があります。通知で通知されたメソッドが呼び出されると、proceed()メソッドを呼び出す必要があります。動員されていない場合、通知されたメソッドの呼び出しをブロックする可能性があります。

5.3。通知のパラメーターを処理します。

ここに画像の説明を挿入します

  • @pointcutアノテーションは、以前と同様に名前付きポイントカットを定義するために使用されますが、違いは、通知メソッドに提供されるパラメーターがポイントカットで宣言されることです。
    ここに画像の説明を挿入します
  • args(trackNumber)修飾子に注意してください。これは、playTrack()メソッドに渡されたint型パラメーターが通知にも渡されることを示します。
  • ポイントカット定義のパラメーターは、ポイントカットメソッドのパラメーター名と同じです。これにより、指定されたポイントカットから通知メソッドへのパラメーターの転送が完了します。
  • メソッドパッケージングは​​、アスペクトによって実現できる機能の1つにすぎません。

5.4。注釈を介して新しい関数を導入します。

  • イントロダクションとして知られるAOPの概念を使用して、アスペクトはSpringBeanに新しいメソッドを追加できます。
    ここに画像の説明を挿入します
  • 導入されたインターフェイスのメソッドが呼び出されると、エージェントは新しいインターフェイスを実装する他のオブジェクトに呼び出しを委任します。実際、Beanの実装は複数のクラスに分割されています。
  • 検証、Encoreableインターフェースの導入。
    ここに画像の説明を挿入します
  • 新しいアスペクトを作成します。フロント、リア、サラウンドなどの通知は提供されません。代わりに、Encoreableインターフェースが@DeclareParentsアノテーションを介してPerormanceBeanに導入されます。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
  • SpringアプリケーションでEncoreableIntroducerをBeanとして宣言する必要があることに注意してください
<bean class = "concert.EncoreableIntroducer">
  • Springの自動プロキシメカニズムが宣言を取得します。SpringがBeanが@Aspectアノテーションを使用していることを検出すると、Springはプロキシを作成し、呼び出されたメソッドがプロキシされているBeanに属しているかどうかに応じて、委任されたBeanまたは導入された実装を呼び出します。または導入されるインターフェース。

6.XMLでアスペクトを宣言します。

  • アノテーションベースの設定はJavaベースの設定に基づいている必要があり、Javaベースの設定はXMLベースの設定によるものである必要があります。アスペクトを宣言したいが通知クラスにアノテーションを追加できない場合は、 XML構成を使用します。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
  • 前のクラスからすべての注釈を削除します
    ここに画像の説明を挿入します

6.1。事前宣言と事後通知

ここに画像の説明を挿入します

  • ほとんどのAOP構成要素<aop:config>は、要素のコンテキスト内で使用する必要がありますこのルールにはいくつかの例外がありますが、Beanがアスペクトとして宣言されている場合は、常に<aop:config>最初から構成します。
  • この要素内で、1つ以上の通知、側面、または連絡先を宣言できます。
  • 通知アノテーション(<aop:before>)でメソッド属性宣言メソッドを使用し、ポイントカットを使用してポイントカットを宣言します。

ここに画像の説明を挿入します

  • すべての通知要素で、pointcut属性は通知によって適用されるポイントカットを定義し、その値はAspectJポイントカット式構文によって定義されたポイントカットです。
  • <aop:pointcut>定義を使用して、一般的なポイントカットに名前を付けます
    ここに画像の説明を挿入します

6.2。声明は通知を囲んでいます。

  • watjcPerformance()メソッドを復元します。
    ここに画像の説明を挿入します
  • <aop:around>要素を使用して、周囲の通知をXMLで宣言します。
    ここに画像の説明を挿入します

6.3。通知用のパラメーターを渡します。

  • 同様に、以前にTrackCounterのすべての@AspectJアノテーションを削除します。
    ここに画像の説明を挿入します
  • XMLを使用して、TrackCounterをパラメーター化されたアスペクトとして構成します。
    ここに画像の説明を挿入します

6.4。アスペクトを通じて新機能を導入する

  • 前のセクションでは、Aspectの@DeclareParentsアノテーションを使用し<aop:declare-parents>、notifiedメソッドの新しいメソッドを紹介しました。XMLで要素を使用することもできます
    ここに画像の説明を挿入します
  • タイプがパフォーマンスインターフェイス(types-matching属性で指定)と一致するBeanには、親クラス構造に追加されたEnableableインターフェイス(implement-interface属性で指定)があります。
  • default-impl属性の完全修飾クラス名を使用して、指定されたEncoreableの実装を示します。または、delegate-ref属性を使用して識別します。
    ここに画像の説明を挿入します
  • これはBeanへの参照であるため、Beanを作成する必要があります。default-implを使用して世界を識別することと間接的にdelegate-refを使用することの違いは、後者がSpring Beanであり、それ自体を注入、通知、または他のSpring構成を使用します。
    ここに画像の説明を挿入します

7.まとめ

  • 機能:AOPを使用すると、ビジネスロジックのさまざまな部分を分離できるため、ビジネスロジックのさまざまな部分間の結合が減り、プログラムの再利用性が向上し、同時に開発の効率が向上します。
  • 使用法:注釈またはXML書き込みの形式でAOPを使用できます。

おすすめ

転載: blog.csdn.net/JISOOLUO/article/details/105707380