8

私のモデル レイヤーは少数の異なるプロジェクトで使用されており、どのプロジェクトがそれを使用しているかに関係なく、モデルに 1 つの XML Spring 構成ファイルを使用したいと考えています。

私の質問は次のとおりです。すべてのプロジェクトですべての Bean が使用されているわけではないため、インスタンス化されていない場合、かなりの量のリソースを浪費していますか? 今まで問題になったことがないので、Spring がそれらをロードするのがどれほど怠惰であるかはよくわかりません。

何か案は?

4

4 に答える 4

8

Spring Reference Manualから引用:

ApplicationContext 実装のデフォルトの動作は、起動時にすべてのシングルトン Bean を熱心に事前インスタンス化することです。事前インスタンス化とは、ApplicationContext が初期化プロセスの一部としてすべてのシングルトン Bean を積極的に作成および構成することを意味します。一般に、これは良いことです。構成または周囲の環境のエラーがすぐに発見されることを意味するからです (数時間または数日後に発生する可能性があるのとは対照的に)。

ただし、この動作が望ましくない場合もあります。ApplicationContext を使用するときにシングルトン Bean を事前にインスタンス化したくない場合は、Bean 定義を遅延初期化としてマークすることで、これを選択的に制御できます。遅延初期化された Bean は、起動時または最初に要求されたときに Bean インスタンスを作成する必要があるかどうかを IoC コンテナーに示します。

XML 経由で Bean を構成する場合、この遅延読み込みは [bean element] の「lazy-init」属性によって制御されます。例えば:

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>

ただし、Bean がファイル ロックやデータベース接続などのリソースを使い果たしている場合を除き、複数の (ただし異なる) プロファイルに対してこの 1 つの構成を使用する方が簡単であれば、単純なメモリ オーバーヘッドについてはあまり心配しません。

于 2008-09-19T01:08:13.717 に答える
5

他のコメントに加えて、<beans/>要素の 'default-lazy-init' 属性を使用して、構成ファイル全体を遅延初期化するように指定することもできます。例えば:

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>

lazy-initこれは、多数の Bean がある場合、すべての Bean に属性を追加するよりもはるかに簡単です。

于 2008-09-29T19:18:22.480 に答える
0

デフォルトでは、Spring Beanはシングルトンであり、アプリケーションコンテキストが作成されたとき(起動時)にインスタンス化されます。したがって、デフォルトの動作をオーバーライドしていないと仮定すると、すべてのBeanの単一のインスタンスが作成されます。

于 2008-09-19T00:51:39.933 に答える
-1

オブジェクトによって異なります。

しかし、未使用のコードは「粗雑」であり、メンテナンスのコストが増加します。

参照とクラスを削除することをお勧めします。後で必要になった場合は、いつでもバージョン管理から復元できます。

于 2008-09-19T00:58:31.417 に答える