延迟初始化的 Bean

默认情况下,ApplicationContext作为初始化的一部分,实现急切地创建和配置所有 singleton bean 过程。通常,这种预实例化是可取的,因为 配置或周围环境会立即被发现,而不是几个小时 甚至几天后。当此行为不可取时,您可以阻止 通过将 Bean 定义标记为 lazy-initialized 初始化的。延迟初始化的 bean 告诉 IoC 容器创建一个 bean instance,而不是在启动时。spring-doc.cadn.net.cn

此行为由@Lazy注解或 XML 中的lazy-init属性<bean/>元素,作为 以下示例显示:spring-doc.cadn.net.cn

@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"/>

当上述配置被ApplicationContextlazy豆 不会预先实例化ApplicationContext开始 而notLazy一个是急切地预先实例化的。spring-doc.cadn.net.cn

但是,当延迟初始化的 bean 是单例 bean 的依赖项时,即 not lazy-initialized,则ApplicationContext在 startup,因为它必须满足单例的依赖项。延迟初始化的 bean 被注入到其他位置未进行延迟初始化的单例 bean 中。spring-doc.cadn.net.cn

你还可以通过使用@Lazy注解@Configuration带注释的类或在 XML 中使用default-lazy-init属性<beans/>元素,如下例所示 显示:spring-doc.cadn.net.cn

@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>