遅延初期化された Bean

デフォルトでは、ApplicationContext 実装は、初期化プロセスの一環としてすべてのシングルトン Bean を積極的に作成して構成します。一般に、構成や周囲の環境のエラーは数時間、場合によっては数日後ではなく、すぐに発見されるため、この事前インスタンス化が望ましいです。この動作が望ましくない場合は、Bean 定義を遅延初期化としてマークすることで、シングルトン Bean の事前インスタンス化を防ぐことができます。遅延初期化 Bean は、起動時ではなく最初にリクエストされたときに Bean インスタンスを作成するように IoC コンテナーに指示します。

XML では、次の例に示すように、この動作は <bean/> 要素の lazy-init 属性によって制御されます。

<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.something.AnotherBean"/>

上記の構成が ApplicationContext によって使用される場合、ApplicationContext の開始時に lazy Bean は事前にインスタンス化されませんが、not.lazy Bean は事前にインスタンス化されます。

ただし、遅延初期化された Bean が遅延初期化されていないシングルトン Bean の依存関係である場合、ApplicationContext はシングルトンの依存関係を満たす必要があるため、起動時に遅延初期化 Bean を作成します。レイジー初期化された Bean は、レイジー初期化されていない他の場所のシングルトン Bean に注入されます。

次の例に示すように、<beans/> 要素の default-lazy-init 属性を使用して、コンテナーレベルで遅延初期化を制御することもできます。

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