延遲初始化 Bean
預設情況下,ApplicationContext 實現會在初始化過程中急切地建立和配置所有單例 bean。通常,這種預例項化是可取的,因為配置或周圍環境中的錯誤會立即被發現,而不是在數小時甚至數天之後。當不需要這種行為時,可以透過將 bean 定義標記為延遲初始化來阻止單例 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 是一個非延遲初始化的單例 bean 的依賴項時,ApplicationContext 會在啟動時建立該延遲初始化的 bean,因為它必須滿足該單例 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>