延迟初始化的 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>