2009-06-03 15 views

答えて

8

サーブレットインスタンスは、反射を介しコンテナによって作成され、それらは公共、引数なしのコンストラクタ(デフォルトコンストラクタ)を見つけることを期待します。

サーブレットを設定するには、web.xmlファイルで指定されたサーブレットパラメータを使用します。これらはサーブレットのinit()メソッドに渡されます。


それがデフォルト以外のコンストラクタを選択し、単純型に文字列を強要し、反射的コンストラクタを呼び出すためのサーブレットコンテナの可能であろうが、これは、サーブレット仕様が必要とするものではありません。

一部の理由は歴史的かもしれません。依存関係注入システムがこの選択肢を広く実践する前にサーブレットが最初に指定されました。しかし、そのようなコンストラクタはかなり制限されています。 web.xmlで指定された単純な文字列から作成できる引数を渡すのが現実的ですが、より有用なオブジェクト— DataSource、たとえば—は扱いにくいでしょう。

最終的なメンバー変数をサーブレットに含めるといいでしょう。

以前は「WebBeans」(JSR 299、私は思う)として知られていたJSRは、Servletsにおける依存性注入サポートのためのいくつかの標準を提供します。これは、現在のアプローチにおけるいくつかの欠点に対処するかもしれない。

+0

しかし、なぜそれがデフォルトのコンストラクタを期待していますか?リフレクションも使用して、パラメータ化されたコンストラクタを呼び出すことができます。 –

+0

それでは、コンストラクタでどのような値を渡すべきでしょうか。 – artemb

+0

Servlet 3.0が提供しているものを見たことがありますか? –

1

サーブレットはコンテナによってインスタンス化されるため、引数のないコンストラクタが必要です。

さらに、コンテナはサーブレットを再利用し、再利用時にコンストラクタを呼び出すことはありません。

1

変数を<servlet-param>で初期化するか、Springのようなフレームワークを使用して、ほかのBeanと同じように動作する別のクラスにサーブレットをプロキシできるようにする必要があります。

1

いいえ!サーブレットにパラメータ化されたコンストラクタを提供することはできません。サーブレットコンテナは、に基づいてオブジェクトを作成します。サーブレットコンテナは、 オブジェクトを作成します。 Class.forName()を使用してクラスにオブジェクトを作成することができます。クラスにデフォルトのコンストラクタのみが含まれている場合、コンテナがオブジェクトを作成するときにClass.forName()コードを使用するため、サーブレットとしてパラメータ化されたコンストラクタを書き出しません。パラメータ化されたコンストラクタを記述したい場合でも、コンストラクタをservice()メソッドから呼び出す必要があります。

関連する問題