日記というよりは過去を振り返るときのための単なる備忘録この広告は、90日以上更新していないブログに表示しています。2016-12-07CDIで@Dependentなクラスを@Injectするときに引数を渡す方法(メモ)javaTweet概要CDIで、@Dependentなクラスを定義し、利用する側のクラスのフィールドで@Injectするときに、任意のパラメータを渡したい。ここでパラメータargを渡したい。引数つきの@Qualifierを定義し、@Producesを使うことで実現できる。foo;}@Qualifierを定義するとき、@Nonbindingを指定することで、マッチングする場合に引数の中身は無視されるようになる。@FooParameter("")の引数にかかわらず、@FooParameterの限定子をつけているものは、すべて、この@Producesメソッドにマッチするようになる。@Producesでは、InjectionPoint引数を受け取ることでアノテーションを取得できる(@Qualifier以外も可)ので、ここでパラメータを受け取ることができる。あとは、@DefaultにマッチするFooのインスタンスを生成して明示的にパラメータを渡してから返せば良い。@Disposesの実装Fooインスタンスが不要になったタイミングでの後始末が必要ならば、以下のように@Disposesを実装する。}Instance#get()で取得されたインスタンスは、対となるInstance#destroyメソッドによって明示的な破棄処理を行うことができる。これにより、Fooクラス内に@PreDestroyメソッドが定義されている場合、これが呼び出されることになる。(この処理を入れないと@PreDestroyを呼び出すべきタイミングがなくなってしまう。DeltaSpikeのBeanProvider.injectFieldsで直接入れることも可。DeltaSpikeではinjectFielsで以下のようなことをやっている。}もし、Fooを以下のように引数つきコンストラクタにしてパラメータなしでのインスタンス化をできないようにしたとする。CDIの管理外とする。}}これは、@Producesによって明示的に非管理Beanをインスタンス化できる。Fooクラスのフィールド中の@Injectを実施する。}}newによって生成されたインスタンスなので、Fooの@Injectの指定のあるフィールドは未初期化状態のままである。ここでDeltaSpikeのinjectFieldsによって@Injectのフィールドを明示的に注入する。@PreDestroyなどのイベント的な処理も行うわけではないので、既存の非管理クラスをインスタンス化する場合でなければ、javax.enterprise.inject.Instanceを使って管理ビーンとして生成するのが結局は簡単になると思われる。マニュアルでinjectしたビーンの@PreDestroyを動かしたいのであれば、BeanProvider#injectFieldsで使用したCreationalContextを保存しておいて、@Disposes内で、creationContext.releaseする必要がある。(javax.enterprise.inject.Instanceは、それを行っている。(1)はてなブログをはじめよう!seraphyさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。