遅延初期化された 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>