返回

Lazy-Init 在 Spring 中的运作原理

后端

概述

在 Spring 中,lazy-init 是一种延迟初始化 bean 的机制。默认情况下,Spring 在启动时会初始化所有 singleton bean。然而,如果一个 bean 被标记为 lazy-init,那么它将不会在启动时被初始化,而是在第一次被使用时才被初始化。

lazy-init 的实现

lazy-init 的实现主要依赖于 Spring 的 BeanPostProcessor 机制。BeanPostProcessor 是一个可以在 bean 初始化前后执行自定义逻辑的接口。Spring 提供了多种内置的 BeanPostProcessor,其中一个就是 LazyInitializationBeanPostProcessor。

LazyInitializationBeanPostProcessor 在 bean 初始化之前执行,它会检查 bean 是否被标记为 lazy-init。如果是,则它会将 bean 的初始化推迟到第一次使用时才进行。

lazy-init 与 bean 的作用域和生命周期

lazy-init 与 bean 的作用域和生命周期密切相关。Spring 中 bean 的作用域主要有四种:singleton、prototype、request 和 session。

  • singleton :表示 bean 只会被实例化一次,并且在整个应用程序中都是单例的。
  • prototype :表示 bean 每次被使用时都会被实例化一个新的对象。
  • request :表示 bean 只会在一次 HTTP 请求中存在,当请求结束时 bean 就会被销毁。
  • session :表示 bean 只会在一次 HTTP 会话中存在,当会话结束时 bean 就会被销毁。

lazy-init 只对 singleton bean 有效。对于 prototype、request 和 session bean,它们总是会被立即初始化。

lazy-init 也会影响 bean 的生命周期。Spring 中 bean 的生命周期主要分为三个阶段:实例化、属性填充和初始化。

  • 实例化 :bean 被创建并分配内存。
  • 属性填充 :bean 的属性被填充。
  • 初始化 :bean 的初始化方法被调用。

对于 lazy-init bean,只有当它被第一次使用时,才会执行实例化、属性填充和初始化这三个阶段。

结论

lazy-init 是 Spring 中一种延迟初始化 bean 的机制。它可以提高应用程序的性能,特别是对于那些不经常使用的 bean。lazy-init 只对 singleton bean 有效,并且它会影响 bean 的生命周期。