2011-09-17 15 views
4

Guice to Inject Providersを既存のJava Webアプリケーションのサーブレット部分に正常に使用しましたが、ビジネスレイヤー(非サーブレットJavaクラス)を使用します。Java Web AppのビジネスレイヤへのGuice注入

私はインジェクタを注入していますが、ガイスのドキュメントを含め、いくつかの場所でハックのように思えますが、あまりそれをしないと言います。

私の質問は、非サーブレット/フィルタクラスがGuiceServletContextListenerを拡張するために使用するクラスで作成されたインジェクタにアクセスできるようにJava Webアプリケーションをブートストラップする場所ですか?注射器を注射せずにこれらのクラスを注射可能にする方法はありますか?

ご連絡ありがとうございます。ご要望があればお知らせください。

編集:

私はシンプルなロガーでこれを行うにしようとしています、これまでのところ、私の サーブレットでは、私が呼ぶ:

@Inject 
    private static org.slf4j.Logger log; 

次のように注入がMyLoggerModuleに設定されています( )ServletModuleと createInjector呼び出しである:

@Override 
    public void configure() { 
     bindListener(Matchers.any(), new SLF4JTypeListener()); // I 
     built my own SLF4JTypeListener... 
    } 

これはすべてのサーブレットで完璧に動作しますが、フィールド注入を行いますサーブレットまたはフィルタではないクラスによって呼び出されたときには、 は機能しません。

答えて

1

Guiceは新しいオブジェクトの呼び出しを傍受しません。ビジネスレイヤがGuiceを使用してまだ注入が必要なオブジェクトを作成していない場合は、変更する必要があります。

注射中Guice によって処理された場合にのみ注射が行われます。。あなたが作ったベースインジェクタから始めて、あなたが要求したインスタンスに必要なものは@Injectとマークされていますが、可能な限りGuiceによって提供され、それらのインスタンシエーション中にさらに@Inject注釈が付けられます新たなものを創造する必要がなくなるまで、提供者と拘束力によって埋められます。その時点からGuiceの注入の外に作成されたサーブレットにフィールドを注入することはありません。恐らくnewをどこかに呼び出すことで、おそらくオブジェクトファクトリがやっていることです。

オブジェクトファクトリを新しいものではなくプロバイダを使用するように変更する必要があります。これらを編集することができれば、Guiceがデフォルトのバインディングプロバイダを提供できるので、それほど難しいことではありません。

ビジネス層でGuiceが認識できるようにするには、まずサーブレットを作成してInjectorを作成してから、インジェクタでサーブレットを作成するよう要求します。これは、複数のインジェクタを持つことを意味する場合、それは問題になりますが、シングルトンにしたいオブジェクトに対してのみです。したがって、シングルトンインジェクタのファクトリパターンクラスを作ることができます。あるいは、サーブレット自体を作成しているこれらのクラス(ここではtyped bar)が(fooで)作成された場所を見つけることができます。 Guiceのインジェクタを使ってこれらの(バータイプ)クラスを作成し、バーブタイプを変更して、新しいサーブレットを呼び出す代わりに使用するサーブレットのプロバイダをリクエストします。

ここでは、10-20種類のサーブレットで1回または2回しか発生しない場合はシンプルにすることができます。また、新しくなったものに対して完全に柔軟な動作を定義するフレームワークがあれば複雑になる可能性がありますいつ、なぜ。

もう一つの選択肢は、推奨されているように、常に@Injectフィールドを避けることです。したがって、あなたのサーブレットは、建設パラメータとしてorg.slf4j.Loggerを受け取ります。コンストラクタには@Injectというマークが付けられ、パラメータの値がフィールドに割り当てられます。そして、あなたが注入を使用していない場所は、新しい呼び出しで間違った数のパラメータで壊れます。代わりにここで提供されているサーブレットを取得する方法、またはサーブレットのプロバイダをクラスに追加する方法を考えて、これらの問題を修正します。

+0

残念ながら、サードパーティのAPIであるため、オブジェクトファクトリを編集することはできません。ご回答いただきありがとうございます。 – oberger

+0

@OwenBerger大歓迎ですが、編集できないのは残念です。 – dlamblin

0

あなたのサーブレット/フィルタにオブジェクトを注入すると、それらのオブジェクトはGuiceによっても依存関係が注入されているので、途中で終了します。

このロガーを挿入しようとしているクラスをどのように作成していますか?彼らは注射するためにGuiceによって作られなければなりません。つまり、newを意味しません。

+0

私は上記の説明をいくつか入れました...ありがとうございます。 – oberger

+0

私はあなたの編集を得ました...私はオーバーライドまたは拡張できないいくつかのクラスを作成するオブジェクトファクトリを使用するサードパーティのAPIを使用しています。それらのインスタンスのように私は元のインジェクタを、私がオリジナルを作成するために使用した静的なファクトリクラスを通して呼び出すことに悩まされています。私は私のウェブアプリケーションを介して行ったと私は思ったほど一般的ではありません。 – oberger