1. 序章

このチュートリアルでは、Springを使用したAOP(アスペクト指向プログラミング)を紹介し、この強力なツールを実際のシナリオで使用する方法を学習します。

Spring AOPを使用して開発する場合、 AspectJのアノテーションを活用することもできますが、この記事では、コアSpringAOPXMLベースの構成に焦点を当てます。

2. 概要

AOPは、横断的関心事の分離を可能にすることでモジュール性を高めることを目的としたプログラミングパラダイムです。これは、コード自体を変更せずに既存のコードに動作を追加することで実現します。

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

SpringのAOPフレームワークは、これらの横断的関心事を実装するのに役立ちます。

3. Mavenの依存関係

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

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

依存関係の最新バージョンはここで確認できます。

4. AOPの概念と用語

AOPに固有の概念と用語について簡単に説明します。

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);
    }
}

上記の例では、 afterReturn、というメソッドを持つ単純なJavaクラスを定義しました。このメソッドは、タイプ Object の1つの引数を取り、その値にログインします。 AdderAfterReturnAspect でさえ標準クラスであり、Springアノテーションがないことに注意してください。

次のセクションでは、このアスペクトをビジネスオブジェクトにワイヤリングする方法を説明します。

4.3. ジョインポイント

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

Spring AOPでは、JoinPointは常にメソッドの実行を表します。

4.4. ポイントカット

Pointcut は、特定のJoinPointAspectによって適用されるAdviceと一致するのに役立つ述語です。

AdvicePointcut式に関連付けることがよくあり、Pointcutと一致するJoinpointで実行されます。

4.5. アドバイス

Advice は、特定のJoinpointでアスペクトによって実行されるアクションです。 さまざまな種類のアドバイスには、「周囲」、「前」、「後」が含まれます。

Springでは、 Advice がインターセプターとしてモデル化され、Joinpointの周りにインターセプターのチェーンが維持されます。

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

次に、返品後のアドバイスを使用して、ビジネスオブジェクトをアスペクトにワイヤリングする方法を見てみましょう。

以下は、標準のSpring構成に配置する構成の抜粋です。 「「 鬼ごっこ:

<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というアスペクトのインスタンスを作成しました。

もちろん、ここでの選択肢はXMLだけではありません。 前述のように、AspectJアノテーションも完全にサポートされています。

4.7. 構成の概要

タグaop:config を使用して、AOP関連の構成を定義できます。 configタグ内で、アスペクトを表すクラスを定義します。次に、作成した「doAfterReturningAspect」アスペクトBeanの参照を指定します。

次に、pointcutタグを使用してポイントカットを定義します。 上記の例で使用されているポイントカットはexecution(* org.baeldung.logger.SampleAdder +。*(..))、です。これは、SampleAdderクラス内の任意のメソッドにアドバイスを適用することを意味します。これは、任意の数の引数を受け入れ、任意の値型を返します。

次に、適用するアドバイスを定義します。 上記の例では、返品後のアドバイスを適用しました。 これは、属性メソッドを使用して定義した afterReturn メソッドを実行することにより、アスペクトAdderAfterReturnAspectで定義しました。

アスペクト内のこのアドバイスは、タイプ Object。の1つのパラメーターを取ります。このパラメーターは、ターゲットメソッド呼び出しの前および/または後にアクションを実行する機会を提供します。 この場合、メソッドの戻り値をログに記録するだけです。

Spring AOPは、アノテーションベースの構成を使用して複数のタイプのアドバイスをサポートします。 この例とその他の例は、ここここにあります。

5. 結論

この記事では、AOPで使用される概念を説明しました。 また、SpringのAOPモジュールの使用例も確認しました。 AOPについて詳しく知りたい場合は、次のリソースを参照してください。

これらの例の実装は、GitHubにあります。