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