延迟初始化 Bean
默认情况下,ApplicationContext
实现会在初始化过程中急切地创建和配置所有
单例 bean。通常,这种预实例化是可取的,因为配置或周围环境中的错误会立即被发现,而不是在数小时甚至数天后才发现。当这种行为不可取时,你可以通过将 bean 定义标记为延迟初始化来阻止单例 bean 的预实例化。延迟初始化的 bean 会告诉 IoC 容器在第一次请求时创建 bean 实例,而不是在启动时创建。
此行为由 @Lazy
注解控制,或者在 XML 中由 <bean/>
元素上的 lazy-init
属性控制,如下例所示:
当 ApplicationContext
消费上述配置时,lazy
bean 不会在 ApplicationContext
启动时被急切地预实例化,而 notLazy
bean 则会被急切地预实例化。
然而,当一个延迟初始化的 bean 是一个非延迟初始化的单例 bean 的依赖时,ApplicationContext
会在启动时创建这个延迟初始化的 bean,因为它必须满足单例的依赖。延迟初始化的 bean 会被注入到其他非延迟初始化的单例 bean 中。
你还可以通过在 @Configuration
注解的类上使用 @Lazy
注解,或者在 XML 中使用 <beans/>
元素上的 default-lazy-init
属性来控制一组 bean 的延迟初始化,如下例所示: