1前書き

このチュートリアルでは、Springと一緒にAOP(Aspect Oriented Programming)を紹介し、この強力なツールを実用的なシナリオで使い始める方法を理解します。

Spring AOPを使用して開発する場合は、

AspectJのアノテーション

を利用することもできますが、この記事では、Spring AOPの中心となるXMLベースの構成に焦点を当てています。


2概要

  • AOPは、分野横断的な関心事の分離を可能にすることによってモジュール性を高めることを目的としたプログラミングパラダイムです** コード自体を変更することなく既存のコードに追加の動作を追加することによってそうします。

代わりに、この新しいコードとこれらの新しい動作を別々に宣言できます。

Springのhttps://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop[AOP framework]は、これらの分野横断的な懸念を実装するのに役立ちます。


3 Mavenの依存関係


pom.xml

にSpringのAOPライブラリ依存関係を追加することから始めましょう。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE<version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

依存関係の最新バージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7C%20(g%3A%22org.springframework.boot%22%20AND%20a%3A% 22spring-boot-starter-parent%22)%20OR%20%20(g%3A%22org.springframework.boot%22%20AND%20a%3A%22spring-boot-starter-parent%22)%20OR%20%20( g%3A%22org.springframework.boot%22%20AND%20a%3A%22spring-boot-starter-aop%22)[ここ]。


4 AOPの概念と用語

AOPに固有の概念と用語を簡単に見てみましょう。

リンク:/uploads/Program__Execution.jpg%201000w[]


4.1. ビジネスオブジェクト

ビジネスオブジェクトは、通常のビジネスロジックを持つ通常のクラスです。

2つの数値を追加したビジネスオブジェクトの簡単な例を見てみましょう。

public class SampleAdder {
    public int add(int a, int b) {
        return a + b;
    }
}

このクラスはビジネスロジックを持ち、Spring関連のアノテーションを持たない通常のクラスです。


4.2. アスペクト

一側面は、複数のクラスにまたがる懸念のモジュール化です。統合ロギングは、そのような分野横断的な懸念の一例です。

単純なアスペクトを定義する方法を見てみましょう。

public class AdderAfterReturnAspect {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    public void afterReturn(Object returnValue) throws Throwable {
        logger.info("value return was {}",  returnValue);
    }
}

上記の例では、

Object

型の引数を1つ取る

afterReturn

というメソッドを持つ単純なJavaクラスを定義したところで、その値でログインします。

AdderAfterReturnAspect

でさえもSpringのアノテーションがない標準クラスです。

次のセクションでは、このアスペクトをビジネスオブジェクトに関連付ける方法を説明します。


4.3. ジョインポイント


ジョインポイント

は、メソッドの実行や例外の処理など、プログラムの実行中のポイントです。

Spring AOPでは、

JoinPoint

は常にメソッドの実行を表します。


4.4. ポイントカット

Pointcutは、特定の

JoinPoint



Aspect

によって適用される

Advice

を一致させるのに役立つ述語です。

アドバイスはしばしば

Pointcut

式に関連付けられており、Pointcutにマッチした任意の

Joinpoint

で実行されます。


4.5. 助言

アドバイスは、特定の結合点でアスペクトによって取られるアクションです。

さまざまな種類のアドバイスには、「前後」、「前」、「後」のアドバイスがあります。

Springでは、

Advice

はインターセプターとしてモデル化され、

Joinpoint

の周りに一連のインターセプターを維持しています。


4.6. ビジネスオブジェクトとアスペクト

の配線

返品後のアドバイスを使って、ビジネスオブジェクトをアスペクトに関連付ける方法を見てみましょう。

以下は、標準的なSpring設定の

“ <beans>”

タグに配置する抜粋です。

<bean id="sampleAdder" class="org.baeldung.logger.SampleAdder"/>
<bean id="doAfterReturningAspect"
  class="org.baeldung.logger.AdderAfterReturnAspect"/>
<aop:config>
    <aop:aspect id="aspects" ref="doAfterReturningAspect">
       <aop:pointcut id="pointCutAfterReturning" expression=
         "execution(**  org.baeldung.logger.SampleAdder+.** (..))"/>
       <aop:after-returning method="afterReturn"
         returning="returnValue" pointcut-ref="pointCutAfterReturning"/>
    </aop:aspect>
</aop:config>

見てのとおり、ビジネスオブジェクトのインスタンスを表す

simpleAdder

という単純なBeanを定義しました。また、

AdderAfterReturnAspect

というAspectのインスタンスを作成しています。

XMLはもちろん、ここでの唯一の選択肢ではありません。前述のように、

AspectJ

アノテーションも完全にサポートされています。


4.7. 一目でわかる設定

タグ

aop:config

は、AOP関連の設定を定義するために使用されます。


config

タグ内で、アスペクトを表すクラスを定義します

作成した

“doAfterReturningAspect”

__アスペクトBeanの参照を指定しました。

次に、

pointcut

タグを使用してPointcutを定義します。上記の例で使用されているポイントカットは

execution(

org.baeldung.logger.SampleAdder。

(..))

です。これは

SampleAdder

クラス内の任意のメソッドにアドバイスを適用し、任意の数の引数を受け入れて任意の値型を返すことを意味します。

次に、どのアドバイスを適用したいかを定義します。上記の例では、attributeメソッドを使用して定義された

afterReturn

という名前のメソッドを実行することによって、Aspect

AdderAfterReturnAspect

で定義された返品後のアドバイスを適用します。

Aspect内のこのアドバイスは、__Object型のパラメータを1つ取ります。このパラメータによって、ターゲットメソッドの呼び出しの前後にアクションを実行する機会が得られます。この場合は、メソッドの戻り値を記録するだけです。

Spring AOPはアノテーションベースの設定を使って複数のアドバイスをサポートします – これともっと多くの例は

ここ



ここ

にあります。


5結論

このチュートリアルでは、AOPで使用される概念とSpringのAOPモジュールの使用例を示しました。 AOPについてもっと知りたいという方は、以下の資料をご覧ください。

春]

これらの例の実装はhttps://github.com/eugenp/tutorials/tree/master/spring-aop[GitHubプロジェクト]で見つけることができます – これはMavenベースのプロジェクトです。そのまま実行します。