4

Guice を使用して、既存の Java Web アプリケーションのサーブレット部分にプロバイダーを挿入することに成功しましたが、アプリケーションのビジネス レイヤー (サーブレット以外の Java クラス) を介してインジェクターにアクセスできません。

Injecting the Injector について読んだことがありますが、私にはそれはハックのように思えます。

私の質問は、サーブレット/フィルター以外のクラスが、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...
   }

これはすべてサーブレットで完全に機能しますが、サーブレットまたはフィルターではないクラスによって呼び出された場合、フィールド注入は機能しません。

4

2 に答える 2

1

Guiceは新しいオブジェクトの呼び出しをインターセプトしないため、ビジネスレイヤーでGuiceを使用してインジェクションが必要なオブジェクトを作成していない場合は、変更する必要があります。

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

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

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

これについて考えると、10〜20のサーブレットタイプで1〜2回しか発生しない場合は単純な場合もあれば、いつ、なぜ新しくなるかについて完全に柔軟な動作を定義するフレームワークがある場合は複雑になる場合もあります。

もう1つのオプションは、推奨されているように、フィールドでの@Injectを常に回避することです。これで、サーブレットはorg.slf4j.Logger構築パラメータとしてを取り入れています。コンストラクターにはマークが付けられ@Inject、パラメーターの値がフィールドに割り当てられます。そうすれば、インジェクションを使用していない場所は、新しい呼び出しで誤った数のパラメーターで中断するはずです。代わりにここで提供されるサーブレットを取得する方法、またはサーブレットのプロバイダーをクラスに取得する方法を理解して、これらを修正してください。

于 2011-09-24T23:13:43.513 に答える
0

何を意味するのかわかりません...オブジェクトをサーブレット/フィルターに注入すると、それらのオブジェクトにはGuiceによって注入された依存関係も含まれます。

このロガーを注入しようとしているクラスをどのように作成していますか? 注入するには、Guice によって作成する必要があります。つまり、 nonewです。

于 2011-09-18T03:13:30.100 に答える