7.4.4 延迟初始化的bean

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

在XML中,此行为由<bean/>元素上的lazy-init属性控制;例如:

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

如果上述配置被ApplicationContext使用了,当ApplicationContext启动时,名为lazy的bean不会被预先实例化,而not.lazybean则会立即预实例化。

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

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

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>

书籍推荐