延迟初始化的Bean

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

在XML中,这种行为由<bean/>元素上的lazy-init属性控制,如下例所示:

<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.something.AnotherBean"/>

当上述配置被ApplicationContext消耗时,lazy bean在ApplicationContext启动时不会被急切地预实例化,而not.lazy bean会被急切地预实例化。

然而,当一个延迟初始化的bean是一个不是延迟初始化的单例bean的依赖项时,ApplicationContext会在启动时创建延迟初始化的bean,因为它必须满足单例的依赖关系。延迟初始化的bean被注入到另一个不是延迟初始化的单例bean中。

您还可以通过在<beans/>元素上使用default-lazy-init属性来在容器级别控制延迟初始化,如下例所示:

<beans default-lazy-init="true">
	<!-- 不会预实例化任何bean... -->
</beans>