見出し画像

Javaエンジニア向け 勉強配信 【Spring3入門】10年放置してた本をついに開封!!#7【一旦最終話】~Spring AOP~

はじめに

さあ今回も前回に引き続き、Springの学習です。

■読み進めている本はこちら↓

**Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ**

■元動画はこちら↓

Javaエンジニア向け 勉強配信 【Spring3入門】10年放置してた本をついに開封!!#7(一旦最終話)

※動画メインでやっており、このブログ書くのがめんどいのでchatGPTと併用して書いています。

そのため、内容が動画とは若干異なっているのでご注意ください^^;

動画見ていただけたら本書に則して色々言っているので、詳細情報知りたい方は動画を見てくださいね!

では参りましょう!


1. アノテーションを使ったAOP

アノテーションの概要と役割

SpringAOPでは、アノテーションを利用することで、コード中に直接AOPの設定を記述できます。この方法は、設定ファイルを利用する場合と比べて簡潔で直感的な記述が可能です。


各種アドバイスの説明

Beforeアドバイス
メソッド実行前に処理を行います。例えば、入力データのバリデーションに利用できます。

java

@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice() {
    System.out.println("Before method execution");
}

Afterアドバイス
メソッド実行後に常に処理を実行します。

java

@After("execution(* com.example.service.*.*(..))")
public void afterAdvice() {
    System.out.println("After method execution"); 
}

Afterリターニングアドバイス
メソッドが正常に終了した後のみに処理を行います。

java

@AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result") 
public void afterReturningAdvice(Object result) {
    System.out.println("Method returned value is: " + result); 
}

Aroundアドバイス
メソッドの前後で処理を行い、処理のカスタマイズが可能です。

java

@Around("execution(* com.example.service.*.*(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("Before method execution");
    Object result = joinPoint.proceed();           // メソッドを実行
    System.out.println("After method execution");
    return result; 
}

AfterThrowingアドバイス
メソッドで例外がスローされた際に処理を行います。

java

@AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "error")
public void afterThrowingAdvice(Throwable error) {
    System.out.println("Exception thrown: " + error); 
}

2. ポイントカットの記述方法

基本的な構文

ポイントカットは、どのメソッドにアドバイスを適用するかを指定するためのものです。基本構文は以下の通りです:


execution(メソッドの修飾子△(空白)メソッドの戻り値の型△package.classまたはinterface.メソッド名(引数の型 | ,引数の型 ・・・・|)△throws△例外)


例1:
execution(public String com.starlight.service.business.HogeBean.exMethod())

例2:
execution(* com.example.service.*.*(..))

  • *:任意の戻り値

  • com.example.service.*.*:特定のパッケージ内のすべてのクラスとメソッド

  • (..):任意の引数

ワイルドカードと条件指定の活用

  • *:任意の1文字列

  • ..:任意の階層や複数の引数

  • 論理演算子(&&, ||, !)を組み合わせることで複雑な条件も指定可能です。

※Bean定義ファイルでは「&&」は「&&」と書く必要があるようです。


3. Bean定義ファイルを利用したAOP

XMLによるAOP設定の概要

アノテーションを使わず、XML設定でAOPを実現する方法もあります。以下はその例です:

<aop:config>
    <aop:aspect ref="loggingAspect">
        <aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))"/>
        <aop:before pointcut-ref="serviceMethods" method="logBefore" />
    </aop:aspect>
</aop:config>
  • <aop:aspect>:アスペクトを定義します。

  • <aop:pointcut>:ポイントカットを定義します。

  • <aop:before>:Beforeアドバイスを指定します。

アスペクトJスキーマの使用例

Springでは、アスペクトJスキーマを利用して高度なAOPを簡単に設定できます。アノテーションとXML設定を組み合わせることで柔軟な運用が可能です。


4. まとめ

SpringAOPは、業務ロジックと横断的関心事を分離するための強力なツールです。アノテーションとXML設定のいずれを使うかは、プロジェクトの規模や運用方針に応じて選択できます。

さあ、これでいったんSpring3入門を利用した学習は以上となります。
次回はもっと優しめの最新本をテキストとして学習を進める予定です^^

いいなと思ったら応援しよう!