Javaエンジニア向け 勉強配信 【Spring3入門】10年放置してた本をついに開封!!#6~DIxAOPコンテナ、AOPとは何か、Springが提供するAdvice、Proxyを利用したAOP、AOPの使いどころ~
はじめに
さあ今回も前回に引き続き、Springの学習です。
■読み進めている本はこちら↓
**Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ**
■元動画はこちら↓
Javaエンジニア向け 勉強配信 【Spring3入門】10年放置してた本をついに開封!!#6
※動画メインでやっており、このブログ書くのがめんどいのでchatGPTに丸投げしておりますので、ご注意ください(汗
今回は前半は割と動画の内容をまとめてくれてるけど、後半はchatGPTが独自につくちゃってる感があるかな~^^;
ってことで、動画見ていただけたら詳細に色々言っているので、詳細情報知りたい方は動画を見てくださいね!
Springフレームワーク学習ブログ:AOP(アスペクト指向プログラミング)について
1. DI×AOPコンテナ
DIとAOPの役割と関係
Springフレームワークの特徴であるDI(依存性注入)とAOP(アスペクト指向プログラミング)は、互いに補完し合う技術です。
DIは、部品の依存関係を管理し、システムの疎結合化を促進します。
AOPは、横断的関心事(ログ出力やトランザクション管理など)を分離し、オブジェクトが本来行うべき業務処理に集中できるようにします。
DIとAOPを組み合わせるメリット
DIとAOPを組み合わせることで、以下のような効果が得られます:
各部品の役割が明確になり、保守性が向上
共通処理を一箇所にまとめることで、コードの重複を削減
横断的関心事が整理され、テストが容易になる
2. AOPとは何か
AOPの概要と目的
AOP(Aspect-Oriented Programming)は、オブジェクト指向プログラミングを補完する技術です。
本来業務ロジックに集中すべきクラスから、以下のような「横断的関心事」を分離します:
ログ出力
トランザクション管理
セキュリティチェック
これにより、クラスごとに特化した責務を明確化し、モジュール性を向上させます。
横断的関心事の分離
横断的関心事を一箇所にまとめることで、次のような利点があります:
再利用性の向上
修正箇所の特定が容易
各クラスが本来の業務処理に専念できる
3. Springが提供するAdvice
Springでは、以下のようなAdvice(通知)を利用して、AOPを実現します:
Before Advice:対象メソッドの実行前に処理を挿入
例)入力データの検証After Advice:対象メソッドの実行後に処理を挿入
例)処理の結果をログに記録Around Advice:対象メソッドの実行前後で処理を挿入
例)処理の実行時間を測定After Returning Advice:正常終了後に処理を挿入
例)結果に基づく追加処理After Throwing Advice:例外発生時に処理を挿入
例)エラーログの記録やリカバリ処理
これらのAdviceを適切に活用することで、コードの効率化とメンテナンス性の向上が図れます。
4. Proxyを利用したAOP
Proxyの仕組み
SpringのAOPは、Proxy(代理オブジェクト)を利用して実現されます。
Proxyは、対象オブジェクトの前後に処理を追加する役割を担います。
対象オブジェクトを直接変更せず、横断的関心事を実現できます。
AOPを実現するためのProxyの活用
Springでは、以下の2種類のProxyを提供しています:
JDK Dynamic Proxy:インターフェイスを対象としたProxy
CGLIB Proxy:クラス全体を対象としたProxy
これにより、柔軟にAOPを適用できます。
5. AOPの使いどころ
AOPが有効な場面
AOPは、次のような場面で効果を発揮します:
ログ出力や例外処理などの共通処理を整理したい場合
トランザクション管理を一箇所にまとめたい場合
メソッドの実行時間を計測したい場合
AOPの導入による設計の改善
AOPを導入することで、以下の設計改善が期待できます:
共通処理がクラスに埋め込まれなくなるため、コードが簡潔になる
横断的関心事が集中管理され、保守性が向上する
各クラスが独自の責務に集中できるようになる
6. まとめ
AOPは、業務ロジックに集中するための設計手法として非常に有効です。
SpringのAOPは、AdviceやProxyを活用し、横断的関心事を簡単に分離できます。次回は、具体的なコード例を通じて、AOPの実践方法を掘り下げたいと思います!