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

Spring Bean 定義屬性全解析:id、name、class、scope、lazy-init、autowire、生命周期回調

     編輯:Java 相關知識

前言

Spring Bean 定義是 IoC 容器配置的核心。本文系統梳理 <bean> 元素 14 個核心屬性的含義、取值範圍、相互影響與最佳實踐,作為 Spring XML 配置速查手冊。

一、核心屬性速查表

屬性必填默認值核心作用
id否 (但強烈建議)-Bean 唯一標識,符合 XML ID 約束 (字母開頭、無特殊字符)
name否-別名,支援特殊字符,多個用逗號/分號/空格分隔
class是 (非子 Bean)-全限定類名,容器實例化目標類型
parent否-父 Bean 引用,繼承配置,子 Bean 可覆蓋屬性
abstract否falsetrue=模板 Bean,不實例化,供子 Bean 繼承
scope否singletonsingleton/prototype/request/session/application/websocket
lazy-init否defaulttrue=延遲初始化 (僅 singleton);default=繼承容器級默認
autowire否defaultno/byName/byType/constructor/autodetect/default
dependency-check否defaultnone/objects/simple/all/default (配合 autowire 校驗依賴完整性)
depends-on否-強制前置初始化的 Bean 名稱,控制啟動順序
init-method否-初始化回調方法 (無參),屬性注入後調用
destroy-method否-銷毀回調方法 (無參),僅 singleton,容器關閉時調用
factory-method否-工廠方法名,配合 factory-bean 使用,class 屬性失效
factory-bean否-工廠 Bean 名稱,調用其 factory-method 創建實例

二、重點屬性深度解析

2.1 id vs name:標識與別名

  • id:XML ID 類型,唯一,不含特殊字符,推薦作為主鍵
  • name:CDATA 類型,可含 *、#、@ 等特殊字符,適合別名/兼容舊名稱
  • 最佳實踐:<bean id="userDao" name="userDao*,userDaoV2" class="..."/>

2.2 scope:作用域全景

作用域生命週期適用場景備註
singleton容器啟動~關閉,單實例無狀態服務、DAO、工具類默認,線程安全由開發者保證
prototype每次 getBean 新實例有狀態對象、命令模式、請求級容器不管銷毀,需自行管理
request單次 HTTP 請求Web 請求上下文數據僅 Web 環境
sessionHTTP Session 週期用戶購物車、偏好設置僅 Web 環境
applicationServletContext 週期全局配置、緩存僅 Web 環境
websocketWebSocket Session 週期長連接狀態Spring 4+

2.3 autowire:自動裝配四大模式

  1. byName:按屬性名匹配 Bean id,setUserDao() 找 userDao
  2. byType:按類型匹配,唯一 候選,多候選拋異常
  3. constructor:構造器參數按類型匹配,本質同 byType
  4. autodetect:有默認構造器用 constructor,否則 byType (已棄用)

建議:生產環境顯式 <property>/<constructor-arg>,自動裝配降低可讀性、難調試、易誤裝配。

2.4 生命周期回調:init-method / destroy-method


<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" 
      init-method="init" destroy-method="close">
    <property name="jdbcUrl" value="jdbc:mysql://..."/>
</bean>
  • 替代方案:實現 InitializingBean/DisposableBean 接口 (強耦合 Spring)
  • 現代最佳:@PostConstruct / @PreDestroy (JSR-250,需 <context:annotation-config/>)

2.5 父子 Bean 定義復用


<bean id="baseDao" abstract="true" class="com.dao.BaseJdbcDao">
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="userDao" parent="baseDao" class="com.dao.UserDaoImpl">
    <property name="tableName" value="t_user"/>
</bean>
  • 父 Bean abstract="true" 避免實例化
  • 子 Bean 繼承父屬性、構造器參數、初始化方法
  • 子 Bean 可覆蓋/新增屬性

三、工廠模式 Bean 創建

3.1 靜態工廠方法


<bean id="client" class="com.service.HttpClientFactory" factory-method="createClient"/>

3.2 實例工廠方法


<bean id="factory" class="com.service.HttpClientFactory"/>
<bean id="client" factory-bean="factory" factory-method="createClient"/>

四、常見配置錯誤與避坑

錯誤現象根因修正
Bean 重複定義同 id 多次定義檢查導入配置文件去重;使用 allow-bean-definition-overriding
原型 Bean 內存洩漏容器不管理銷毀手動調用 destroy-method;或改用 singleton + 線程局部變量
循環依賴雙向引用無構造器注入改用 setter 注入;或 @Lazy 延遲注入;或重構設計
autowire 失效多候選 Bean標記 @Primary / 顯式指定 / 限定符 @Qualifier

五、總結

Spring Bean 定義屬性看似繁多,核心邏輯只有三條線:標識 (id/name) → 創建 (class/factory/scope) → 裝配與生命周期 (autowire/depends-on/init/destroy)。掌握這 14 個屬性的語義邊界與組合規則,即可駕馭 95% 的 XML 配置場景。現代項目建議註解配置 (@Component/@Bean) 為主,XML 處理基礎設施與跨模塊整合。

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