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

Spring Bean 作用域:Singleton 與 Prototype 核心差異與實戰

     編輯:Java 綜合教學

Spring Bean 作用域:Singleton 與 Prototype

在 Spring XML 配置中,透過 <bean> 的 scope 屬性定義 Bean 的生命週期範圍。若不引入 spring-web,僅支援兩種核心作用域。

一、Singleton(單例,預設)

IOC 容器對每個 Bean 定義僅建立一個實例,整個容器共享。多次 getBean() 返回同一物件引用。

<bean id="employee" class="com.nucsoft.spring.bean.Employee"
      p:empName="emp01" p:age="12"/>
Employee e1 = ctx.getBean(Employee.class);
Employee e2 = ctx.getBean(Employee.class);
System.out.println(e1 == e2); // true
// 輸出同一個 hashcode

二、Prototype(原型)

每次 getBean() 或注入時,容器都會建立新實例。

<bean id="employee" class="com.nucsoft.spring.bean.Employee"
      p:empName="emp01" p:age="12" scope="prototype"/>
Employee e1 = ctx.getBean(Employee.class);
Employee e2 = ctx.getBean(Employee.class);
System.out.println(e1 == e2); // false
// 輸出不同 hashcode

三、Web 環境擴充作用域(補充)

引入 spring-web 後新增:

  • request:每次 HTTP 請求建立新實例
  • session:每個 HTTP Session 建立新實例
  • application:每個 ServletContext 建立新實例
  • websocket:每個 WebSocket 會話建立新實例

四、選擇建議

  • 無狀態服務(Service、DAO、Controller) → Singleton
  • 有狀態物件、每次需獨立實例 → Prototype
  • Prototype Bean 注入 Singleton Bean 時,需用 ObjectFactory、Provider 或 @Lookup 取得新實例
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved