Spring Bean Context に未使用の Bean が多数あると、かなりのリソースが無駄になりますか?
質問
私のモデル レイヤーはいくつかの異なるプロジェクトで使用されており、どのプロジェクトが使用しているかに関係なく、モデルに単一の XML Spring 構成ファイルを使用したいと考えています。
私の質問は次のとおりです。すべての Bean がすべてのプロジェクトで使用されるわけではないため、インスタンス化されていない場合、かなりの量のリソースを無駄にしているのでしょうか?これまで問題になったことはなかったので、Spring がロードに関してどれほど怠惰であるかはよくわかりません。
何か案は?
解決
から抜粋 スプリングリファレンスマニュアル:
ApplicationContext 実装のデフォルトの動作では、起動時にすべてのシングルトン Bean を積極的に事前インスタンス化します。事前インスタンス化とは、ApplicationContext が初期化プロセスの一部としてすべてのシングルトン Bean を積極的に作成して構成することを意味します。一般に、これは良いことです。構成や周囲の環境におけるエラーが (数時間、場合によっては数日後ではなく) 即座に発見されることを意味するからです。
ただし、この動作が望ましくない場合もあります。ApplicationContext の使用時にシングルトン Bean を事前にインスタンス化したくない場合は、Bean 定義を遅延初期化としてマークすることで、これを選択的に制御できます。遅延初期化された Bean は、起動時または最初のリクエスト時に Bean インスタンスを作成する必要があるかどうかを IoC コンテナに示します。
XML 経由で Bean を設定する場合、この遅延読み込みは [Bean 要素] の 'lazy-init' 属性によって制御されます。例えば:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>
ただし、Bean がファイル ロックやデータベース接続などのリソースを使い果たしている場合を除き、複数の (ただし異なる) プロファイルに対してこの 1 つの構成を使用する方が簡単であれば、単純なメモリ オーバーヘッドについてはあまり心配する必要はありません。
他のヒント
他のコメントに加えて:また、「default-lazy-init」属性を使用して、構成ファイル全体を遅延初期化するように指定することもできます。 <beans/>
要素;例えば:
<beans default-lazy-init="true">
<!-- no beans will be pre-instantiated... -->
</beans>
これは、を追加するよりもはるかに簡単です。 lazy-init
多数の Bean がある場合は、すべての Bean に属性を付けます。
デフォルトでは、Spring Bean はシングルトンであり、アプリケーション コンテキストの作成時 (起動時) にインスタンス化されます。したがって、デフォルトの動作をオーバーライドしていないと仮定すると、すべての Bean の単一のインスタンスが作成されます。
オブジェクトによって異なります。
ただし、未使用のコードは「粗末」であり、メンテナンスのコストが増加します。
参照とクラスを削除することをお勧めします。後で必要になった場合には、いつでもバージョン管理から復元できます。