首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring 容器 Bean 初始化全流程:單例/原型、懶加載與生命週期回調

     編輯:Java 綜合教學

Spring 容器 Bean 初始化全流程解析

Spring IoC 容器管理 Bean 生命週期的核心機制,包含作用域控制、實例化時機、初始化/銷毀回調。本文透過實戰代碼演示預設單例、原型模式、懶加載配置與生命週期介面應用。

Bean 作用域:singleton vs prototype

<!-- 預設 singleton:容器啟動建立單例,後續 getBean 返回同一實例 -->
<bean id="people" class="com.example.People" />

<!-- prototype:每次 getBean 均建立新實例 -->
<bean id="people" class="com.example.People" scope="prototype" />
特性singletonprototype
實例數量容器中唯一共享實例每次請求新建實例
建立時機容器啟動時(預設)首次 getBean 時
銷毀回調容器關閉時執行不執行(容器不管銷毀)
適用場景無狀態服務、DAO、Controller有狀態物件、每次需獨立狀態

懶加載:lazy-init

<bean id="people" class="com.example.People" lazy-init="true" />
<!-- 值選項:default(等同 false)、true、false -->
  • true:首次 `getBean()` 時才實例化(僅對 singleton 生效)。
  • false/default:容器啟動階段預先實例化。
  • 適用於啟動耗時大、低頻使用的重量級 Bean。

生命週期回調三種方式

  1. 實作介面(強耦合 Spring API,不推薦新專案)
    public class People implements InitializingBean, DisposableBean {
        @Override public void afterPropertiesSet() { /* 初始化邏輯 */ }
        @Override public void destroy() { /* 銷毀邏輯 */ }
    }
  2. XML 配置方法名(低侵入性)
    <bean id="people" class="com.example.People"
          init-method="init" destroy-method="cleanup" />
  3. 註解 @PostConstruct / @PreDestroy(JSR-250 標準,推薦)
    @Component public class People {
        @PostConstruct public void init() { ... }
        @PreDestroy public void cleanup() { ... }
    }

完整生命週期流程圖

實例化 
  → 屬性注入 (setter/自動裝配)
  → Aware 介面回調 (BeanNameAware, BeanFactoryAware, ApplicationContextAware)
  → BeanPostProcessor.postProcessBeforeInitialization
  → 初始化回調 (afterPropertiesSet / @PostConstruct / init-method)
  → BeanPostProcessor.postProcessAfterInitialization
  → Bean 就緒可用
  → (容器關閉/請求結束)
  → 銷毀回調 (destroy / @PreDestroy / destroy-method)

實戰驗證代碼

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
People p1 = ctx.getBean("people", People.class);
People p2 = ctx.getBean("people", People.class);
System.out.println(p1 == p2); // singleton: true | prototype: false
((ConfigurableApplicationContext) ctx).close(); // 觸發銷毀回調

最佳實踐建議

  1. 預設用 singleton,有狀態才用 prototype。
  2. 大型 Bean、非核心啟動路徑 Bean 加 `lazy-init="true"`。
  3. 3. 優先用 @PostConstruct/@PreDestroy,避免 XML 與代碼分離維護困難。 4. prototype Bean 搭配 `ObjectFactory` 或 `Provider` 注入,解決單例注入原型 Bean 只能拿到同一實例的問題。

掌握 Bean 生命週期全景圖,能精準控制資源分配與釋放,排查初始化順序異常、記憶體洩漏等疑難雜症。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved