Spring AOPトピック
AOPとは
AOP(アスペクト指向プログラミング)とは、アスペクト指向プログラミングを意味します。これは、動的エージェントを事前にコンパイルして実行することにより、プログラム機能の統合メンテナンスを実現するテクノロジーです。(動的エージェントについては、以前のブログを参照してください。)以降、AOPは「横断的」と呼ばれます。
「クロスカッティング」テクノロジーは、カプセル化されたオブジェクトの内部を分析し、複数のクラスに影響を与える一般的な動作を再利用可能なモジュールにカプセル化し、「アスペクト」、つまりアスペクトと名付けました。いわゆる「アスペクト」は、ビジネスとは何の関係もないロジックまたは責任ですが、カプセル化されたビジネスモジュールによって呼び出されます。これは、システムの反復コードを減らし、モジュール間の結合を減らし、将来の操作性を促進するのに便利です。そして保守性。「横断的」技術を使用して、AOРはソフトウェアシステムを2つの部分に分割します。ビジネス処理の主なプロセスは中心的な関心事であり、関連性の低い部分は横断的関心事です。横断的関心事の特徴は、コア関心事の複数の場所で発生することが多く、許可認証、ログなど、基本的にどこでも類似していることです。AOPの役割は、システム内のさまざまな懸念を分離し、横断的な懸念からコアの懸念を分離することです。
要約すると、AOPの核となる考え方は1文です:
ソースコードを変更して新しい関数を追加しないでください。
AOPアプリケーションのシナリオ
それでは、実際の開発におけるAOPの適用シナリオは何ですか?
1.認証権限
2.キャッシュをキャッシュする
3.コンテキスト渡しのコンテンツ配信
4.エラー処理
5.遅延読み込み
6.デバッグ
7、ログ記録、追跡、プロファイリング、監視記録追跡最適化キャリブレーション
8、持続性の持続性
8.パフォーマンスの最適化
10.リソースプーリング
11.同期
12.トランザクション
春のAOPの役割
宣言型トランザクションを提供し、ユーザーがアスペクトをカスタマイズできるようにします
AOPのコアコンセプト
- 分野横断的な問題:アプリケーションの複数のモジュールにまたがるメソッドまたは関数。私たちのビジネスロジックに関係なくても、私たちが焦点を当てる必要がある部分は、分野横断的な焦点です。例:ログ、セキュリティ、キャッシュ、トランザクションなど……
- 側面:横断的な関心事がモジュール化されている特別なオブジェクト。つまり、クラスです。
@Aspectで注釈されたクラスはアスペクトであると簡単に考えることができます。
- アドバイス:いわゆる通知は、接続ポイントをインターセプトした後に実行されるコードです。通知は、事前通知、事後通知、例外通知、最終通知、サラウンド通知の5つのカテゴリに分類されます。
通知タイプ | ジャンクション | 実装インターフェース |
---|---|---|
アドバイス前(アドバイス前) | メソッドの前 | org.springframework.aop.MethodBeforeAdvice |
通知を投稿する() | メソッドの後 | org.springframework.aop.AfterReturningAdvice |
サラウンド通知() | メソッドの前後 | org.aopalliance.intercept.MethodInterceptor |
例外スロー通知() | メソッドが例外をスローします | org.springframework.aop.ThrowsAdvice |
紹介通知() | クラスに新しいメソッド属性を追加する | org.springframework.aop.IntroductionInterceptor |
- ターゲット:通知されるオブジェクト。
- プロキシ:ターゲットオブジェクトに通知を適用した後に作成されたオブジェクト。
- PointCut:ポイントカット通知実行の「場所」の定義。
- ジョイントポイント(JointPoint):エントリポイントと一致する実行ポイント。
アスペクト、参加ポイント、ポイントカット、アドバイスを完全に理解する
上記の理論を読んだ後、私は誰もがまだ混乱していると思います。私もそうです。AOPのアスペクト、ジョイントポイント、ポイントカット、アドバイスの理解を深めるための簡単な例を次に示します
Javaと呼ばれる小さな郡があったと仮定します。1か月間の暗くて風の強い夜に、この郡で殺人が発生しました。殺人者は非常に狡猾で、貴重な手掛かりがシーンに残っていませんでした。幸い、ギャング隣から戻ってきた古い王は、この時点で偶然に殺人者のプロセスを発見しましたが、遅くて殺人者が彼の顔を覆っていたため、古い王は殺人者の顔をはっきりと見ませんでした。彼は、殺人者が男性であり、身長について知っているだけでした。 7フィート5インチ。ジャバ郡の郡治安判事は、古い王の説明によると、門を守る兵士に命じました。高さが7フィート5インチであることが判明した人は、逮捕して尋問する必要があります。もちろん、兵士は郡治安判事の命令に違反することはあえてしません。 、私は街に出入りする資格のあるすべての人々を逮捕しなければなりませんでした。
上記のストーリーとAOPの対応関係を見てみましょう。
まず、Spring AOPでは、結合ポイントはすべてのメソッドの実行ポイントを指し、ポイントカットは記述情報であり、結合ポイントは、ポイントカットを介して、どの結合ポイントをアドバイスに組み込むことができるかを決定できます。上記の例に対応して、単純なアナロジーを実行できます。結合ポイントは、Javaの小さな町の人々と同等です。ポイントカットは同等です殺人者は7フィート5インチ程度立って、男だったことを、ファラオによって作られた疑惑:容疑王がアクションを説明してアドバイスをラインに適用されている間、尋問のために把握。
なぜ、このアナロジーができます?
- 結合ポイント-> Javaの小さな郡の人々:定義により、結合ポイントはすべてアドバイスに織り込まれる可能性がある候補ポイントであるため、Spring AOPでは、すべてのメソッド実行ポイントを結合ポイントと見なすことができます。上記の例では、殺害は小さな郡で発生し、この郡の全員が容疑者である可能性があるのは当然のことです。
- ポイントカット->男性、高さ約7フィート5インチ:すべての方法(ジョイントポイント)がアドバイスに組み込まれる可能性があることはわかっていますが、すべての方法でアドバイスに組み込まれる必要はなく、ポイントカットの役割はジョインポイントに一致するルールのセット、ルールのジョインポイントに一致するようにアドバイスを追加します。同様に、彼は愚かで、郡内のすべての人々を尋問のために逮捕できることを知って
凶手是个男性, 身高约七尺五寸
いますが、の要件を満たすためにここで凶手是个男性, 身高约七尺五寸
は、殺人犯の範囲を定義する修正された述語があり、この修正されたルールを満たします。人々は疑われ、逮捕され、尋問されたニーズです。 - アドバイス->取り調べのためにそれをつかみます。アドバイスはアクション、つまりJavaコードの断片です。このJavaコードの断片は、ポイントカットによって定義された結合ポイントに作用します。同じように、
抓过来审问
この例では作用するものを満たしています。男性, 身高约七尺五寸
爪哇的小县城里的百姓
- アスペクト:アスペクトはポイントカットとアドバイスの組み合わせであるため、ここで類推できます。「ラオワンの手がかりによれば、身長が7フィート5インチであることが判明したすべての男性を捕まえ、尋問する必要があります。」この行動全体を考慮することができます。一面です。
参照
https://segmentfault.com/a/1190000007469968
Springを使用してAOPを実装する
AOPウィービングを使用して、アスペクト依存パッケージをインポートします
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
実行式:
たとえば、エントリポイント式の実行を定義します(* com.sample.service.impl ... *。*(...))<------すべてのクラスのすべてのメソッド
- execution():式の本体。
- 最初の番号:は戻り値の型を示し、番号はすべての型を示します。
- パッケージ名:インターセプトする必要があるパッケージの名前を示します。その後の2つのピリオドは、現在のパッケージと現在のパッケージのすべてのサブパッケージ、
com.sample.service.implパッケージ、および子孫パッケージの下のすべてのクラスのメソッドを示します。 - 2番目の番号はクラス名を示し、番号はすべてのクラスを示します。
- (...):最後のアスタリスクはメソッド名を表し、数字はすべてのメソッドを表し、次の括弧はメソッドパラメータを表し、2つのピリオドは任意のパラメータを表します
方法1:SpringのAPIインターフェースを使用して達成する
<!-- 方式一:使用原生SpringAPI接口-->
<!-- 配置AOP:需要导入aop 的约束-->
<aop:config>
<!--切入点:expression:表达式,execution(要执行的位置!* * * *)-->
<aop:pointcut id="pointcut" expression="execution(* com.feng.service.UserServiceImpl.*(..))"/>
<!--执行环绕增加-->
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>
方法2:AOPを実装するようにクラスをカスタマイズする
【主にアスペクトの定義】
<!--方式二:自定义类-->
<bean id="diy" class="com.feng.diy.DiyPointCut"/>
<aop:config>
<aop:aspect ref="diy">
<!--切入点-->
<aop:pointcut id="point" expression="execution(* com.feng.service.UserServiceImpl.*(..))"/>
<!--通知-->
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
方法3:アノテーションで実現
<!-- 方式三-->
<bean id="annotationPointCut" class="com.feng.diy.AnnotationPointCut"/>
<!-- 开启注解支持!-->
<aop:aspectj-autoproxy/>
AnnotationPointCut.java
package com.feng.diy;
//方式三:使用注解方式实现AOP
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
//标注这个类是一个切面
public class AnnotationPointCut {
@Before("execution(* com.feng.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("=====方法执行前=====");
}
@After("execution(* com.feng.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("=====方法执行后=====");
}
//在环绕增强中,我们可以给定一个参数,代表我们要获取处理切入的点
@Around("execution(* com.feng.service.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable {
System.out.println("环绕前");
Object proceed = jp.proceed();
//执行方法
System.out.println("环绕后");
// Signature signature = jp.getSignature();//获得签名
// System.out.println("signature:"+signature);
// System.out.println(proceed);
}
}
実装
https://blog.csdn.net/java_cxrs/article/details/108372459
よくある質問
Spring AOPについて説明する
Spring AOP(アスペクト指向プログラミング)はOOP(オブジェクト指向プログラミング)の補足であり、モジュール性も提供します。オブジェクト指向プログラミングでは、キーユニットはオブジェクトであり、AOPのキーユニットはアスペクトまたはフォーカスです(プログラムの独立したモジュールとして簡単に理解できます)。一元化されたコードを持つ側面もあれば、ログやトランザクションなど、分散または混在する側面もあります。これらの点在する側面は、横断的関心事と呼ばれます。分野横断的な懸念は、アプリケーション全体に影響を与える可能性がある懸念であり、トランザクション管理、権限、ロギング、セキュリティなど、コード内の1つの場所にできるだけ集中する必要があります。
AOPを使用すると、シンプルでプラグ可能な構成を使用して、実際のロジック実行の前、後、または前後に、分野横断的な懸念を動的に追加できます。これにより、現在および将来のコードの保守が容易になります。アスペクトの使用にXMLを使用している場合、懸念事項を追加または削除するには、完全なソースコードを再コンパイルする必要はなく、構成ファイルを変更するだけで済みます。
Spring AOPは次の2つの方法で使用されます。ただし、最も広く使用されている方法は、Spring AspectJアノテーションスタイル(Spring AspectJアノテーションスタイル)です。
- AspectJアノテーションスタイルを使用する
- Spring XML構成スタイルを使用する
SpringにおけるAOPのフォーカスと分野横断的なフォーカスの違いは何ですか
アプリケーションモジュールに実装されている動作をまとめたいと思います。焦点は次のように定義できます。特定のビジネス問題を解決する方法。たとえば、eコマースアプリケーションでは、さまざまな懸念事項(またはモジュール)が在庫管理、出荷管理、ユーザー管理などです。
横断的な懸念とは、アプリケーション全体に及ぶ懸念です。ロギング、セキュリティ、データ変換と同様に、これらはアプリケーションのすべてのモジュールで必要とされるため、横断的な懸念事項です。
AOPの利用可能な実装は何ですか?
Javaに基づく主なAOP実装は
1、AspectJ
2、SpringAOP
3、JBossAOP
Springのさまざまな通知タイプとは
アドバイスとは、プログラムの他のモジュールに適用したい分野横断的な関心事の実装です。Advieには主に次の5つのタイプがあります。
1. アドバイス前:アドバイスは接続ポイントの前に実行されますが、例外をスローしない限り、実行フローを中断することはできません。このアドバイスを使用するには、** @ Before **アノテーションを使用します。
2. アドバイスの再調整後:接続ポイントが正常になった後に実行されるアドバイス。たとえば、メソッドは例外をスローせずに正常に戻ります。** @ AfterReturning **を使用して使用してください。
3. アドバイスを投げた後:例外を投げてメソッドが終了すると、アドバイスが実行されます。使用する一般的な** @ AfterThrowing **アノテーション。
4. アドバイス後:接続ポイントの終了方法(通常の復帰または例外のスロー)に関係なく、これらのアドバイスは終了後に実行されます。** @ After **アノテーションを使用します。
5. アラウンドアドバイス(アラウンドアドバイス):接続ポイントの周りで実行されるアドバイス。メソッドを呼び出すだけです。これは最も強力なアドバイスです。** @ Around **アノテーションを使用します。
SpringAOPプロキシとは何ですか?
エージェンシーは非常に広く使用されているデザインパターンです。簡単に言えば、エージェントの役割は、エージェントを介したオブジェクトへのアクセスを制御することです。SpringAOPはプロキシに基づいて実装されています。AOPプロキシは、実行時にアスペクトプロトコルを実装するためにAOPフレームワークによって作成されたオブジェクトです。
SpringAOPはデフォルトでAOPプロキシに標準のJDK動的プロキシを使用します。これにより、任意のインターフェース(またはインターフェースのコレクション)をプロキシできます。SpringAOPはCGLibプロキシも使用できます。これは、インターフェイスではなくプロキシクラスに必要です。
ビジネスオブジェクトがインターフェイスを実装していない場合、デフォルトでCGLibが使用されます。
はじめに(はじめに)とは?
導入により、アスペクトは、通知されたオブジェクトが、実際には実装しない追加のインターフェースを実装することを宣言し、これらのオブジェクトのインターフェースの実装を提供できます。** @ DeclareParaents **アノテーションを使用して、紹介を生成します。
ジョイントポイントとポイントカットとは何ですか?
接続ポイントは、プログラム実行のポイントです。たとえば、メソッドの実行や例外の処理などです。SpringAOPでは、接続ポイントは常にメソッドの実行を表します。つまり、これらのメソッドで横断的関心事を使用する場合、独自に定義したインターフェイスのすべてのメソッドを接続ポイントと見なすことができます。
ポイントカット(pointcut)は、接続ポイントと一致するアサーションまたは式です。アドバイスはポイントカット式に関連付けられており、アタッチメントポイントカット一致の任意のポイントで実行されます(たとえば、式execution(*EmployeeManager.getEmployeeById(...))
はEmployeeManager
インターフェイスと一致する場合がありますgetEmployeeById()
)。ポイントカット表現によって一致する接続ポイントの概念は、AOPの中核です。SpringはデフォルトでAspectJポイントカット式言語を使用します。
織りとは?
これらの方法は、分野横断的な懸念の言葉を使用しています。
ポイントカット(pointcut)は、接続ポイントと一致するアサーションまたは式です。アドバイスはポイントカット式に関連付けられており、アタッチメントポイントカット一致の任意のポイントで実行されます(たとえば、式execution(*EmployeeManager.getEmployeeById(...))
はEmployeeManager
インターフェイスと一致する場合がありますgetEmployeeById()
)。ポイントカット表現によって一致する接続ポイントの概念は、AOPの中核です。SpringはデフォルトでAspectJポイントカット式言語を使用します。
織りとは?
Spring AOPフレームワークは、限られた数のAspectJポイントカットタイプのみをサポートするため、IoCコンテナーで宣言されたBeanにアスペクトを適用できます。追加のポイントカットタイプを使用する場合や、Spring IoCコンテナーの外部で作成されたクラスにアスペクトを適用する場合は、SpringプログラムでAspectJフレームワークを使用し、そのウィービング機能を使用する必要があります。