延遲初始化 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>