遅延初期化された Bean
デフォルトでは、ApplicationContext
実装は、初期化プロセスの一環としてすべてのシングルトン Bean を積極的に作成して構成します。一般に、構成や周囲の環境のエラーは数時間、場合によっては数日後ではなく、すぐに発見されるため、この事前インスタンス化が望ましいです。この動作が望ましくない場合は、Bean 定義を遅延初期化としてマークすることで、シングルトン Bean の事前インスタンス化を防ぐことができます。遅延初期化 Bean は、起動時ではなく最初にリクエストされたときに Bean インスタンスを作成するように IoC コンテナーに指示します。
この動作は、次の例に示すように、@Lazy
アノテーションまたは XML では <bean/>
要素の lazy-init
属性によって制御されます。
Java
Kotlin
XML
@Bean
@Lazy
ExpensiveToCreateBean lazy() {
return new ExpensiveToCreateBean();
}
@Bean
AnotherBean notLazy() {
return new AnotherBean();
}
@Bean
@Lazy
fun lazy(): ExpensiveToCreateBean {
return ExpensiveToCreateBean()
}
@Bean
fun notLazy(): AnotherBean {
return AnotherBean()
}
<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="notLazy" class="com.something.AnotherBean"/>
前述の構成が ApplicationContext
によって使用される場合、ApplicationContext
の起動時に lazy
Bean は積極的に事前インスタンス化されませんが、notLazy
は積極的に事前インスタンス化されます。
ただし、遅延初期化された Bean が遅延初期化されていないシングルトン Bean の依存関係である場合、ApplicationContext
はシングルトンの依存関係を満たす必要があるため、起動時に遅延初期化 Bean を作成します。レイジー初期化された Bean は、レイジー初期化されていない他の場所のシングルトン Bean に注入されます。
次の例に示すように、@Configuration
アノテーション付きクラスで @Lazy
アノテーションを使用するか、XML で <beans/>
要素の default-lazy-init
属性を使用して、Bean セットの遅延初期化を制御することもできます。
Java
Kotlin
XML
@Configuration
@Lazy
public class LazyConfiguration {
// No bean will be pre-instantiated...
}
@Configuration
@Lazy
class LazyConfiguration {
// No bean will be pre-instantiated...
}
<beans default-lazy-init="true">
<!-- No bean will be pre-instantiated... -->
</beans>