Spring AOPの紹介

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ベースのプロジェクトです。そのまま実行します。