Web周りのことを中心に。それ以外のことも気まぐれに投稿します。呼ばれて飛び出てジャジャジャジャーン、@madapajaです。使って依存性の注入を行ってみました。インターセプターを使い、アスペクト指向プログラミングの体験を中心に進めてみたいと思います。前回の補足...と、その前に前回の補足を。後に実行するメソッド)の定義を行いました。今回のサンプルの場合、コンストラクタ上で呼び出しても挙動は変わりません。コンストラクタで行わないのか、その理由を3つほど考えてみました。(@koriymさんからもアドバイスをもらいました)1つめは、関心を分離させるためです。内でその構成されたオブジェクトに対しての初期化処理を記述することで関心を分離させられます。全ての依存が注入されているのが保証されています。Setterを使ったインジェクションも可能です。コンストラクタでも、Setterでも注入するという点では同じですし、挙動も基本的に変わりませんが、Setterインジェクションを行うことで、traitを利用しやすくなります。(実際に、BEAR.Sundayではtraitを利用して、テンプレートエンジンを注入したり、様々な箇所で使用されています。内でしか初期化できない処理も考えられるでしょう。同時にインターセプタを利用することが可能です。(逆に言えば、コンストラクタ内から別メソッド呼び出してもインターセプトされません。そのため、このアノテーション内では同時にインターセプトを利用することもできる、というわけです。sandboxアプリではDevModule(動作モード)がフレームワークモジュール、機能のモジュール、アプリケーションモジュール等をinstallしてます。するのかといった具合です。そのモジュール内では必要なDI、AOP設定を行います。2012とあるように、モジュールは関心ごとに分離すべきです。(今回はサンプルなので...)Ray.Diには、あるモジュールの中から他のモジュールをインストール(追加設定のような感じ)する機能があります。機能・関心ごとにモジュールを分離させることで、たとえば、実行(本番、テスト、開発)モードが要求する機能や関心を、必要に応じて構成させることができるようになります。これは、下のつぶやきにもあるように、BEAR.Sundayの大きな特徴の一つです。2012すべてのメソッドにインターセプタをバインドしてみるでは、ようやく本編です。処理時間を計るタイマーインターセプタを作り、それをすべてのメソッドへ問答無用で追加(バインド)してみたいと思います。呼び出されるのでその中で前後に挟み込みたい処理を記述します。今回は以下のように作りました。}}処理としては、メソッド開始前後にメソッド名とタイマー状況のアウトプットと、計測処理を行っているだけですね。メソッドは呼び出される際に引数としてメソッド実行に必要な知識を持ったオブジェクト(MethodInvocation)が渡されます。することでオリジナルのメソッドを実行します。さあ、インターセプタが出来たのでそれをバインドします。前回説明したとおり、アプリケーションやフレームワークを構成する際に使われる知識はモジュールが持ちます。インターセプタをバインドする処理を追加します。メソッドでインターセプタをバインドしています。つの引数を取り、1つ目はクラスのマッチャーを、2つめはメソッドのマッチャーを、3つめはインターセプターの配列を渡します。渡すことで、すべてのメソッドに適用されるようになります。して実行してみると、タイマーインターセプタがバインドされていることが分かるかと思います。:アノテーションを使って特定のメソッドにインターセプタをバインドしてみる次に、トランザクションを行うインターセプタを作って特定のメソッドへのバインドをしてみます。特定のメソッドへのバインドは、メソッド名のプレフィックスやアノテーションでマッチさせることができますが、今回は汎用的に使えるようにアノテーションでマッチさせるようにします。タイマーの時と同じように、トランザクションインターセプタを作ります。オブジェクト)を取得しています。アクセスを行いたいのですが、このプロパティはプライベートプロパティのため、そのままアクセスすることができません。16行目でリフレクションプロパティを取得し、プロパティをアクセス可能にした上でトランザクション処理を行っています。次に、このインターセプタを適用させるアノテーションを作ります。アノテーションという名前で以下のように作りました。クラスに適用させましょう。アノテーションするだけです。マッチャーを使ってバインドします。して実行してみましょう。メソッドのみにトランザクションが行われているのが分かるかと思います。触りをご紹介できたと思います。インターセプター面白いです。其の壱はてなブログをはじめよう!ja9さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。