延迟初始化的 Bean
默认情况下,ApplicationContext
作为初始化的一部分,实现急切地创建和配置所有 singleton bean
过程。通常,这种预实例化是可取的,因为
配置或周围环境会立即被发现,而不是几个小时
甚至几天后。当此行为不可取时,您可以阻止
通过将 Bean 定义标记为
lazy-initialized 初始化的。延迟初始化的 bean 告诉 IoC 容器创建一个 bean
instance,而不是在启动时。
此行为由@Lazy
注解或 XML 中的lazy-init
属性<bean/>
元素,作为
以下示例显示:
-
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
豆
不会预先实例化ApplicationContext
开始
而notLazy
一个是急切地预先实例化的。
但是,当延迟初始化的 bean 是单例 bean 的依赖项时,即
not lazy-initialized,则ApplicationContext
在
startup,因为它必须满足单例的依赖项。延迟初始化的 bean
被注入到其他位置未进行延迟初始化的单例 bean 中。
你还可以通过使用@Lazy
注解@Configuration
带注释的类或在 XML 中使用default-lazy-init
属性<beans/>
元素,如下例所示
显示:
-
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>