Spring AOP(1):概要

1. AOPの第一印象

まず、より専門的な用語を(Baiduから)与えます:

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方
式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个
热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑
的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高
了开发的效率。

次に、比較的理解しやすい例を示します(from:Spring AOP)。

アスペクトプログラミングを理解するには、アスペクトとは何かを理解する必要があります。ナイフを使ってスイカを2つに分け、切り目は麺で、料理の場合は鍋とコンロが一緒になって料理を完成させ、鍋とコンロが麺です。Webレベルの設計では、Webレイヤー->ゲートウェイレイヤー->サービスレイヤー->データレイヤー、各レイヤーもアスペクトです。プログラミングでは、オブジェクトとオブジェクトの間、メソッドとメソッドの間、モジュールとモジュールがすべての側面です。

通常、アクティビティを実行するときは、各インターフェイスの有効性(開始するかどうか、終了するかどうかなど)、およびこのインターフェイスにユーザーがログインする必要があるかどうかを確認します。

通常のロジックによると、これを行うことができます。 
这里写图片描述

これの問題は、いくつのインターフェイスが存在するために必要なコードのコピーの数です。「怠惰な人」にとって、これは耐えられない。さて、パブリックメソッドを考えてみましょう。各インターフェイスがこのインターフェイスを呼び出します。スライス麺のようなにおいがします。 
这里写图片描述

また、毎回コードをコピーする必要はありませんが、インターフェイスごとにこのメソッドを呼び出さなければならないという問題もあります。アスペクトという概念があるので、インターフェース呼び出し(ポイントカット)の特定の場所にメソッドを注入します。

这里写图片描述

このようにして、インターフェースは特定のビジネスについてのみ考慮する必要があり、インターフェースではない他のロジックや処理について考慮する必要はありません。 
赤いボックスはアスペクト指向プログラミングです。

2、AOPの関連概念

上記の例を見た後、誰もがAOPについて大まかな考えを持っていると思いますが、上記の側面など、いくつかのあいまいさがいくつかあります。次に、関連するAOPについて説明します。概念AOPの概念を理解することによってのみ、AOPの本質を正確に把握できます。 
最初に、より専門的なコンセプトの定義を示します

  • Aspect(アスペクト):アスペクト宣言はJavaのクラス宣言に似ており、アスペクトにはいくつかのポイントカットと対応するアドバイスが含まれます。
  • Joint point(接続ポイント):プログラムの明確に定義されたポイントを表します。通常、メソッドの呼び出し、クラスメンバーへのアクセス、例外ハンドラーブロックの実行などが含まれます。他のジョイントポイントをネストすることもできます。
  • Pointcut(連絡先):論理的な関係を介して結合される、またはワイルドカード、正規表現などを介して収集されるジョイントポイントのグループを表します。対応するアドバイスが発生する場所を定義します。
  • Advice(強化):アドバイスは、その中Pointcut で定義されたプログラムポイントで実行される特定の操作を定義し  ます。前、後、および前後を使用して、各ジョイントポイントのコードを実行する前、後、または代わりにそれを区別します。
  • Target(ターゲット):ウィービング  Advice のターゲット。
  • Weaving(製織):  Aspect 他のオブジェクトと接続し、Advicedオブジェクトを作成する  プロセス

次に、わかりやすい例を示します。 

看完了上面的理论部分知识, 我相信还是会有不少朋友感觉到 AOP 的概念还是很模糊, 对 AOP 中的各种概念理解的还不是很透彻. 其实这很正常, 因为 AOP 中的概念是在是太多了, 我当时也是花了老大劲才梳理清楚的. 
下面我以一个简单的例子来比喻一下 AOP 中 AspectJoint pointPointcut 与 Advice之间的关系. 
让我们来假设一下, 从前有一个叫爪哇的小县城, 在一个月黑风高的晚上, 这个县城中发生了命案. 作案的凶手十分狡猾, 现场没有留下什么有价值的线索. 不过万幸的是, 刚从隔壁回来的老王恰好在这时候无意中发现了凶手行凶的过程, 但是由于天色已晚, 加上凶手蒙着面, 老王并没有看清凶手的面目, 只知道凶手是个男性, 身高约七尺五寸. 爪哇县的县令根据老王的描述, 对守门的士兵下命令说: 凡是发现有身高七尺五寸的男性, 都要抓过来审问. 士兵当然不敢违背县令的命令, 只好把进出城的所有符合条件的人都抓了起来.

来让我们看一下上面的一个小故事和 AOP 到底有什么对应关系. 
首先我们知道, 在 Spring AOP 中 Joint point 指代的是所有方法的执行点, 而 point cut 是一个描述信息, 它修饰的是 Joint point, 通过 point cut, 我们就可以确定哪些 Joint point 可以被织入 Advice. 对应到我们在上面举的例子, 我们可以做一个简单的类比, Joint point 就相当于 爪哇的小县城里的百姓,pointcut 就相当于 老王所做的指控, 即凶手是个男性, 身高约七尺五寸而 Advice 则是施加在符合老王所描述的嫌疑人的动作: 抓过来审问
为什么可以这样类比呢?

  • Joint point : 爪哇的小县城里的百姓: 因为根据定义, Joint point 是所有可能被织入 Advice 的候选的点, 在 Spring AOP中, 则可以认为所有方法执行点都是 Joint point. 而在我们上面的例子中, 命案发生在小县城中, 按理说在此县城中的所有人都有可能是嫌疑人.

  • Pointcut :男性、約7フィート5インチの高さ:すべてのメソッド(ジョイントポイント)を織ることができることはわかっています  Adviceが、すべてのメソッドAdvice織りたいわけではありません  が  Pointcut 、機能は、ジョインポイントに一致する一連のルールを提供することです。ルールを満たすジョインポイントを追加します  Advice。同様に、郡の治安判事にとって、彼がどんなに気絶していても、彼は郡内のすべての人々が尋問のために逮捕されないことを知っていますが、殺人犯に基づいて、約7フィート5インチの男性です。条件を満たした人物が逮捕されます。ここで、殺人者は男性です。約7フィート5インチの高さは修飾語の述語です。これにより、殺人者の範囲が制限されます。この変更ルールを満たす人はすべて容疑者であり、尋問のために逮捕される必要があります。

  • Advice :取得と問い合わせ  Advice はアクション、つまり、ポイントカットによって定義されたものに作用するJavaコードの一部ですJoint point 。同様に、この例とは対照的に、このアクションの取得  と問い合わせはそれらに影響を与えます高さ7フィート5インチのジャワの小さな郡の町の人々、男性に会います。

  • Aspect::これAspect はポイントカットとのAdvice 組み合わせである  ため、ここで類推できます。「ラオワンの手がかりによれば、身長7フィート5インチであることが判明したすべての男性を捕まえて尋問する必要があります。」このアクション全体を1つと見なすことができます。  Aspect

最後に、これらの概念の関係を説明する図を示します。 
这里写图片描述

3、その他のコンテンツ

AOP中的Joinpoint可以有多种类型:构造方法调用,字段的设置和获取,方法的调用,方法的执行,异常的处理执行,类的初始化。也就是说在AOP的概念中我们可以在上面的这些Joinpoint上织入我们自定义的Advice,但是在Spring中却没有实现上面所有的joinpoint,确切的说,Spring只支持方法执行类型的Joinpoint

Advice 的类型

  • before advice, 在 join point 前被执行的 advice. 虽然 before advice 是在 join point 前被执行, 但是它并不能够阻止 join point 的执行, 除非发生了异常(即我们在 before advice 代码中, 不能人为地决定是否继续执行 join point 中的代码)

  • after return advice, 在一个 join point 正常返回后执行的 advice

  • after throwing advice, 当一个 join point 抛出异常后执行的 advice
  • after(final) advice, 无论一个 join point 是正常退出还是发生了异常, 都会被执行的 advice.
  • around advice, 在 join point 前和 joint point 退出后都执行的 advice. 这个是最常用的 advice.
  • introduction,introduction可以为原有的对象增加新的属性和方法。

Spring中,通过动态代理和动态字节码技术实现了AOP,这些内容,我们将在以后进行讲解。

おすすめ

転載: blog.csdn.net/sanmi8276/article/details/108618572