延遲初始化 Bean

預設情況下,ApplicationContext 實現在初始化過程的早期階段就會建立並配置所有 singleton bean。通常,這種預例項化是可取的,因為配置或周圍環境中的錯誤可以立即被發現,而不是在數小時甚至數天後。當不希望出現這種行為時,可以透過將 bean 定義標記為延遲初始化來阻止 singleton bean 的預例項化。延遲初始化 bean 會告訴 IoC 容器僅在首次請求時建立 bean 例項,而不是在啟動時建立。

此行為由 @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 使用上述配置時,lazy bean 在 ApplicationContext 啟動時不會被立即預例項化,而 notLazy bean 會被立即預例項化。

然而,當一個延遲初始化 bean 是非延遲初始化的 singleton bean 的依賴項時,ApplicationContext 會在啟動時建立該延遲初始化 bean,因為它必須滿足 singleton 的依賴項。延遲初始化 bean 被注入到其他非延遲初始化的 singleton 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>