默认情况下,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"/>
但是,当延迟初始化 bean 是延迟初始化的单例 bean 的依赖项时,ApplicationContext 会在启动时创延迟初始化 bean,因为它必须满足单例的依赖项。延迟初始化 bean 被注入到其他非延迟初始化的单例 bean中。
还可以通过下面的方式控制容器级别的延迟初始化
<beans default-lazy-init="true">
<!-- 不会预实例化任何 bean…-->
</beans>