AOPの素晴らしいところは、あなたは自分の仕事をするだけで、あとは誰かがあなたの代わりにやってくれることです。ある日、あなたは裸で走り回り、服を着たくないので、使用人Aを解雇します。ある日、あなたはお金を持って出かけたいので、使用人Eを雇い、あなたのためにお金をピックアップしてもらいます。ある日、あなたはお金を持って出かけたくなったので、もう一人の使用人Eを雇いました。これがAOPであり、各人がそれぞれの役割を持ち、柔軟に組み合わせることで、構成可能でプラグイン可能なプログラム構造を実現することができます。
I. なぜカッター指向のプログラミングが必要なのか?
オブジェクト指向プログラミングの利点は明らかですが、欠点もあります。ロギングや性能監視など、継承関係のない複数のオブジェクトに対してpublicメソッドを追加する必要がある場合、オブジェクト指向プログラミングを使うと、それぞれのオブジェクトに同じメソッドを追加する必要があるため、作業の重複が多く、繰り返しのコードが大量に発生し、メンテナンスに不向きです。最先端のプログラミングは、オブジェクト指向プログラミングの補足であり、要するに、プログラミングのアイデアの問題の "カット "に統一されたアプローチです。あなたがロギングと処理にAOPのアプローチを使用する場合は、すべてのロギングコードは1つの場所に集中している、大幅にコードの重複を減らすために、各メソッドを追加する必要はありません。
Spring Boot AOP
Notificationには、複数のアプリケーションオブジェクトで使用する必要がある横断的な動作が含まれています。 理解できなくても大丈夫ですが、平たく言えば「いつ」「何を」を定義しています。
接続ポイントとは、プログラムの実行中に通知を適用できるすべてのポイントのことです。
カットポイントとは、"どこで "カットインし、どの接続を通知するかを定義するものです。当然、カットポイントは接続ポイントでなければなりません。
ファセットは、通知とカットポイントの組み合わせです。通知とカットポイントを組み合わせることで、ファセットとは何か、つまり何が、いつ、どこで行われる機能なのかを定義します。
導入により、既存のクラスに新しいメソッドやプロパティを追加できます。
SpringBoot AOPの実践
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
spring-boot-starter-aopにはaspectjweaverが含まれており、バージョンは新しいので、aspectjweaverの依存関係を追加する必要はありません。
3.2 遮断のためのBeanの記述 以下のコードで直接コントローラを定義します:
@RestController public class AopController {.
@RequestMapping("/hello")
public String sayHello(){
System.out.println("hello");
return "hello";
}
}
3.3 カットアウトの定義 SpringはPOJOに@AspectJアノテーションを付けます。ファセットはカットポイントとノーティフィケーションの組み合わせなので、ファセットを定義するにはカットポイントとノーティフィケーションを記述します。コードでは、@Aspectアノテーションを追加するだけです。
3.3.1 カットポイントの定義 カットポイントは、@Pointcut アノテーションとカットポイント式を使用して定義します。
Pointcut アノテーションを使用すると、ファセット内で再利用可能なカットポイントを定義できます。
Springのファサードの最小粒度は、メソッドレベルまでであり、実行式は、明示的にメソッドの戻り値の型、クラス名、メソッド名とパラメータ名およびその他のメソッドに関連するコンポーネントを指定するために使用することができます、実際には、AOPのビジネスシナリオを使用する必要性のほとんどは、メソッドのレベルに到達する必要がありますすることができます、したがって、実行式が最も広く使用されています。図は、実行式の構文を示しています:
の実行は、メソッドが実行されたときにトリガされます。で始まる場合は、メソッドの戻り値の型が任意であることを示します。次に完全修飾クラス名とメソッド名があり、""は任意のクラスと任意のメソッドを示すことができます。メソッドのパラメータリストでは、"..." を使用してパラメータの型が任意であることを示します。複数の式が必要な場合は、"&&"、"||"、"!を使用して、"with"、"or"、"not" の操作を完結させることができます。
3.3.2 通知を定義する 通知には5つのタイプがあります:
事前通知:ターゲット・メソッド呼び出し時に通知を呼び出します。
事後通知:対象メソッドの完了後に通知が呼び出されます。
ラップアラウンド通知:通知されたメソッド呼び出しと起動の後にカスタムメソッドを実行します。
リターン通知:ターゲットメソッドの実行が成功した後に通知が呼び出されます。
例外通知: ターゲットメソッドによって例外がスローされると、通知が呼び出されます。
アスペクト @コンポーネント public class AopAdvice {
@Pointcut("execution (* com.shangguan.aop.controller.*.*(..))")
public void test() {
}
@Before("test()")
public void beforeAdvice() {
System.out.println("beforeAdvice...");
}
@After("test()")
public void afterAdvice() {
System.out.println("afterAdvice...");
}
@Around("test()")
public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
System.out.println("before");
try {
proceedingJoinPoint.proceed();
} catch (Throwable t) {
t.printStackTrace();
}
System.out.println("after");
}
}
3.4 テストの開始 完成後のコードの構造を図に示します:
AopApplicationを実行し、ブラウザで "http://localhost:8080"/helloにアクセスすると、驚くことではありませんが、コンソール出力は図のようになります:





