AOPとは
Aspect Oriented Programingの略語であり,アスペクト指向プログラミングと訳される.
横断的関心事と呼ばれる,共通的な処理を一箇所にまとめる形でプログラムを設計・実装していく.
※本質的関心事と呼ばれる,「本来行いたい処理」と,横断的関心が混在すると保守性の低いプログラムになる可能性がある.
横断的関心事
・ログ出力
・セキュリティ認証
・トランザクション管理
・キャッシュ
・etc...
AOP = 本質的関心事と横断的関心事の分離を実現する手法 と考えられる.
基本的な概念として,Aspect,Join Point,Pointcut,Advice等が存在している.
基本概念
・Aspect → AdviceとPointcutをまとめたもので,横断的関心事がもつ振る舞いと,横断的関心事を実装するプログラム上の位置をまとめたもの.
・Advice → 実装する横断的関心事そのもの.
・JoinPoint → Adviceが行う振る舞いを実装するプログラム上の位置.
・Pointcut → どのAdviceをどのJoinPointに適用するかを指定する,JoinPointの集合.
・Weaving → 割愛.
DIとは
Dependency Injectionの略語であり,依存性の注入と訳される.
オブジェクト間の依存関係を外部から注入することで,疎結合なシステムを実現する設計パターン.
あるオブジェクトから他のオブジェクトを利用することを,そのオブジェクトに「依存する」と表現する.
オブジェクト同士に依存関係がある時,あるクラスを変更した場合はそのクラスを利用するクラスも変更しないといけない.
※保守性の高いアプリケーションを開発するためには,可能な限りクラス間の依存関係を弱める必要がある.
DI = クラス間の依存関係を弱める仕組み と考えられる.
オブジェクトの生成は,アプリケーション内のオブジェクトを管理する機能を持つ「DIコンテナ」が一括で行う.
事前にDIコンテナへ管理クラスを登録しておくことで,オブジェクト(依存性)を生成し,自動的にメンバ変数に代入(注入)してくれる.
DIコンテナに登録されたクラスのオブジェクトを利用するクラスに渡して(注入),依存関係を解決することをインジェクションと呼ぶ.
インジェクションの種類(Spring Framework)
・フィールドインジェクション → リフレクションの仕組みを用いて,メンバ変数に直接渡す方法.
・コストラクターインジェクション → コンストラクターの引数に依存するオブジェクトを渡す方法.
・セッターインジェクション → セッターの引数に依存するオブジェクトを渡す方法.
※Spring Frameworkでは,コンストラクターインジェクションが推奨されている.