6.4.4 延迟初始化的bean
默认情况下,ApplicationContext实现会迫切地创建和配置所有单例bean,作为初始化过程的一部分。普遍情况下,这种预先实例化是合适的,因为配置或周围环境的错误是可以立即被发现的,而不是几小时甚至几天后才发现。如果不希望出现这种行为的话,可以通过将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.lazy的bean。
但是,当延迟初始化的bean是非延迟初始化的单例bean的依赖项时,ApplicationContext会在启动时创建延迟初始化的bean,因为它必须满足单例的依赖关系。 延迟初始化的bean可以被注入到其他地方的非延迟初始化的单例bean中。
你还可以使用在<beans />元素上的default-lazy-init属性在容器级别控制延迟初始化; 例如:
<beans default-lazy-init="true"> <!-- no beans will be pre-instantiated... --> </beans>