Java Spring中Bean配置核心規(guī)則id、name、ref的用法與區(qū)別解析
Spring中Bean配置核心規(guī)則:id、name、ref的用法與區(qū)別
在Spring框架的XML配置中,<bean>
標(biāo)簽及其子標(biāo)簽<property>
的配置是核心基礎(chǔ)。初學(xué)者常對(duì)id
、name
、ref
等屬性的用法產(chǎn)生困惑,本文將系統(tǒng)講解這些屬性的作用、修改規(guī)則及配置原則,幫助開(kāi)發(fā)者快速掌握Spring Bean的配置邏輯。
一、<bean id="xxx">:Bean的唯一標(biāo)識(shí)
1. 作用
id
是Spring容器中Bean的唯一標(biāo)識(shí)符,用于在容器中定位和引用該Bean。例如:
<!-- id為dataSource的數(shù)據(jù)源Bean --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
2. 能否修改?
可以修改,但需遵循兩個(gè)規(guī)則:
- 唯一性:在整個(gè)Spring容器中,
id
的值不能重復(fù)(包括與name
屬性的值重復(fù))。 - 命名規(guī)范:符合XML標(biāo)識(shí)符規(guī)則,不能以數(shù)字開(kāi)頭,避免包含空格、
&
、#
等特殊字符。
3. 命名建議
雖然id
可自定義,但建議根據(jù)Bean的功能命名,提高可讀性:
<!-- 數(shù)據(jù)源Bean --> <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"/> <!-- MyBatis的SqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"/>
二、<property name="yyy">:屬性注入的"鑰匙"
1. 作用
name
屬性用于指定Bean中需要注入的屬性名,Spring通過(guò)該屬性匹配對(duì)應(yīng)的setter方法完成注入。例如:
<bean id="userService" class="com.example.UserService"> <!-- 注入userDao屬性 --> <property name="userDao" ref="userDao"/> </bean>
上述配置會(huì)觸發(fā)UserService
類的setUserDao(UserDao userDao)
方法,完成屬性注入。
2. 能否修改?
不能隨意修改,name
的值必須與目標(biāo)類中的屬性名完全一致(嚴(yán)格區(qū)分大小寫(xiě))。
核心原因:
Spring的屬性注入基于setter方法命名規(guī)范:name="xxx"
對(duì)應(yīng)目標(biāo)類中的setXxx()
方法。例如:
name="dataSource"
→ 對(duì)應(yīng)setDataSource(DataSource dataSource)
name="username"
→ 對(duì)應(yīng)setUsername(String username)
若修改name
的值(如將name="dataSource"
改為name="dbSource"
),而目標(biāo)類中沒(méi)有setDbSource()
方法,Spring會(huì)拋出NoSuchMethodException
異常。
3. 特殊場(chǎng)景:允許修改的情況
只有當(dāng)目標(biāo)類的屬性名發(fā)生變更時(shí),name
才能同步修改。例如:
// 目標(biāo)類屬性名改為dbSource public class UserService { private UserDao dbSource; // 屬性名是dbSource // setter方法同步修改 public void setDbSource(UserDao dbSource) { this.dbSource = dbSource; } }
此時(shí)配置需改為:
<bean id="userService" class="com.example.UserService"> <property name="dbSource" ref="userDao"/> <!-- 與屬性名一致 --> </bean>
三、<property ref="xxx">:依賴引用的"指針"
1. 作用
ref
屬性用于指定當(dāng)前Bean依賴的其他Bean的id,實(shí)現(xiàn)Bean之間的關(guān)聯(lián)。例如:
<!-- 數(shù)據(jù)源Bean --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/> <!-- 依賴數(shù)據(jù)源的SqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 引用id為dataSource的Bean --> <property name="dataSource" ref="dataSource"/> </bean>
2. 能否修改?
可以修改,但必須與被引用Bean的id
(或name
)保持一致。
示例:
若數(shù)據(jù)源Bean的id
改為druidDataSource
,則ref
需同步修改:
<!-- 數(shù)據(jù)源Bean的id改為druidDataSource --> <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"/> <!-- ref需匹配新的id --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="druidDataSource"/> <!-- 與數(shù)據(jù)源id一致 --> </bean>
四、核心規(guī)則對(duì)照表
配置項(xiàng) | 能否修改 | 關(guān)鍵原則 |
---|---|---|
<bean id="xxx"> | 能(唯一即可) | 容器內(nèi)唯一,遵循XML命名規(guī)范 |
<property name="yyy"> | 不能隨意修改(除非屬性名變更) | 必須與目標(biāo)類的屬性名、setter方法名完全一致 |
<property ref="xxx"> | 能(需與被引用Bean的id一致) | 必須等于被引用Bean的id 或name ,確保依賴正確引用 |
五、常見(jiàn)錯(cuò)誤案例分析
錯(cuò)誤1:id重復(fù)
<!-- 錯(cuò)誤:兩個(gè)Bean的id相同 --> <bean id="userDao" class="com.example.UserDao"/> <bean id="userDao" class="com.example.UserDaoImpl"/>
后果:Spring啟動(dòng)時(shí)拋出BeanDefinitionStoreException
,提示id重復(fù)。
錯(cuò)誤2:name與屬性名不匹配
<!-- 錯(cuò)誤:name="userDao"與目標(biāo)類的屬性名userDAO不匹配(大小寫(xiě)錯(cuò)誤) --> <bean id="userService" class="com.example.UserService"> <property name="userDao" ref="userDao"/> </bean> <!-- 目標(biāo)類 --> public class UserService { private UserDao userDAO; // 屬性名是userDAO(大寫(xiě)DAO) public void setUserDAO(UserDao userDAO) { // setter方法是setUserDAO this.userDAO = userDAO; } }
后果:Spring找不到setUserDao()
方法,拋出NoSuchMethodException
。
錯(cuò)誤3:ref與id不匹配
<!-- 數(shù)據(jù)源id是druidDataSource --> <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"/> <!-- 錯(cuò)誤:ref引用了不存在的dataSource --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- ref與id不一致 --> </bean>
后果:Spring找不到id為dataSource
的Bean,拋出NoSuchBeanDefinitionException
。
通過(guò)掌握以上規(guī)則,能有效避免Spring配置中的常見(jiàn)錯(cuò)誤,理解Bean之間的依賴關(guān)系和注入邏輯,為后續(xù)學(xué)習(xí)Spring整合其他框架(如MyBatis、Spring MVC)打下基礎(chǔ)。
到此這篇關(guān)于Java Spring中Bean配置核心規(guī)則id、name、ref的用法與區(qū)別的文章就介紹到這了,更多相關(guān)spring bean id name ref用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)連接kubernates集群的兩種方式詳解
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)連接kubernates集群的兩種方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01解決Springboot配置excludePathPatterns不生效的問(wèn)題
這篇文章主要介紹了解決Springboot配置excludePathPatterns不生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10淺談Spring中@Transactional事務(wù)回滾及示例(附源碼)
本篇文章主要介紹了淺談Spring中@Transactional事務(wù)回滾及示例(附源碼),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Java線程中斷機(jī)制interrupt、isInterrupted、interrupted方法詳解
這篇文章主要介紹了Java線程中斷機(jī)制interrupt、isInterrupted、interrupted方法詳解,一個(gè)線程不應(yīng)該由其他線程來(lái)強(qiáng)制中斷或停止,而是應(yīng)該由線程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已經(jīng)被廢棄了,需要的朋友可以參考下2024-01-01基于jQuery獲取table數(shù)據(jù)發(fā)送到后端
這篇文章主要介紹了基于jQuery獲取table數(shù)據(jù)發(fā)送到后端,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02JAVA并發(fā)中VOLATILE關(guān)鍵字的神奇之處詳解
這篇文章主要給大家介紹了關(guān)于JAVA并發(fā)中VOLATILE關(guān)鍵字的神奇之處的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Springboot 2.x集成kafka 2.2.0的示例代碼
kafka近幾年更新非???,也可以看出kafka在企業(yè)中是用的頻率越來(lái)越高。本文主要為大家介紹了Springboot 2.x集成kafka 2.2.0的示例代碼,需要的可以參考一下2022-04-04