此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

延迟初始化的 Bean

默认情况下,ApplicationContext实现在初始化过程中急切地创建和配置所有单例 Bean 过程。通常,这种预实例化是可取的,因为 配置或周围环境立即被发现,而不是数小时 甚至几天后。当这种行为不可取时,您可以阻止 通过将 Bean 定义标记为 延迟初始化。延迟初始化的 Bean 告诉 IoC 容器创建一个 Bean 实例在首次请求时,而不是在启动时。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>