アスペクト指向プログラミング - AOP

Spring AOP について、触れる前に、AOP そのものについての基本的な考え方や、用語について簡単に確認しておきます。

Spring AOP のドキュメントには、こうあります。

Aspect-Oriented Programming (AOP) complements Object-Oriented Programming (OOP) by providing another way of thinking about program structure. The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect. Aspects enable the modularization of concerns such as transaction management that cut across multiple types and objects. (Such concerns are often termed crosscutting concerns in AOP literature.)

アスペクト指向プログラミング (AOP) は、プログラム構造について考える別の方法を提供することで、オブジェクト指向プログラミング (OOP) を補完します。OOP におけるモジュール化の単位がクラスであるのに対し、AOP ではモジュール化の単位をアスペクト (局面) と置いています。(訳者注: ここでいっている「局面」とは、処理 (メソッド) 間の境界のことを指していると読み取れます。AOP では、この境界に処理を追加していくことで、OOP から、本来の責務とは別で検討すべき複雑さを取り除くことができます。) アスペクトは、複数の型やオブジェクトを横断するトランザクション管理などの問題のモジュール化を可能にします。(このような問題は、多くの AOP の文献で、横断的関心事と呼ばれています。)

用語

AOP には、いくつか用語が存在するため、コードを書きはじめる前に、まずこれらを簡単に確認しておきます。

用語のいくつかを実際のクラスやメソッドの呼び出しに当てはめると、以下の図のようになるため、こちらもイメージをつかむ上での参考としてください。

アスペクト (Aspect)

「局面」といった意味があり、複数のクラスやメソッドを横断する概念をモジュール化したものです。「横断する概念」とは、端的に表現すると、共通的な処理のことを指します。

ジョインポイント (Join point)

メソッドの呼び出しや、例外処理など、アプリケーション実行中の、ある特定の「時点」を指します。

アドバイス (Advice)

特定のジョインポイントにおいて実行される、処理のことを指します。つまり、ジョインポイントの前、後、または前後に共通的に実行される処理のことです。

ポイントカット (Pointcut)

ジョインポイントを文字で表現したものです。

たとえば、io.github.yo1000.sss.Hoge#hoge():String というメソッドがあり、このメソッドの実行前に共通的な処理を割りこませたい場合、@Before("execution(String io.github.yo1000.sss.Hoge.hoge())") のようにポイントカットを記述することで、アドバイスを差し込むことができるようになります。

ポイントカット記述に使用できるアノテーション、および条件は、実に様々なものがあるため、これらについては後述します。

ターゲットオブジェクト (Target object)

ジョインポイントの存在する、ポイントカットに合致したメソッドが実行されているインスタンスを指します。

なお、ターゲットオブジェクトとなることができるのは、DI コンテナに登録済みのインスタンスに対してのみになります。

AOP プロキシー (AOP Proxy)

AOP では、既存処理に対し、別で定義した処理を割りこませるといった動作をします。このように、別々の処理を動的に結びつけるために、フレームワークとしては、動的にクラスやメソッドを拡張できる必要があります。

このとき使用する、動的クラス拡張の仕組みが、プロキシーで、AOP の実現を目的に使用されるものを AOP プロキシーと呼びます。

Spring AOP では、JDK dynamic proxy、または CGLIB proxy が使用されます。これらの使い分けは、ポイントカットでの記述に基づいて変化し、以下のとおり対応します。

ポイントカットで指定されたターゲット 使用されるプロキシー
インターフェース JDK dynamic proxy
クラス CGLIB proxy

なお、JDK dynamic proxy の方が、使用可能なポイントカット記述の種類が多いため、AOP の対象となりうるクラスは、原則としてインターフェースに対して実装していくように心がけるべきでしょう。

参考

results matching ""

    No results matching ""