基于XML配置Spring的自動(dòng)裝配過程解析
一、了解Spring自動(dòng)裝配的方式
采用傳統(tǒng)的XML方式配置Bean組件的關(guān)鍵代碼如下所示
<bean id="userMapper" class="edu.cn.dao.UserMapperImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> <bean id="userService" class="edu.cn.dao.UserServiceImpl"> <property name="userMapper" ref="userMapper"/> </bean>
我們通過<property>標(biāo)簽為Bean的屬性注入所需的值,當(dāng)需要維護(hù)的Bean組件及需要注入的屬性更多時(shí),勢(shì)必會(huì)增加配置的工作量。這時(shí)可以使用自動(dòng)裝配。
二、為每個(gè)Bean組件指定自動(dòng)裝配的方式
使用自動(dòng)裝配修改配置代碼如下
<bean id="userMapper" class="edu.cn.dao.UserMapperImpl" autowire="byName"/> <bean id="userService" class="edu.cn.dao.UserServiceImpl" autowire="byName"/>
通過設(shè)置<bean>元素的autowire屬性指定自動(dòng)裝配,代替了通過<property>標(biāo)簽顯示指定Bean的依賴關(guān)系。由BeanFactory檢查XML配置文件的內(nèi)容,為Bean自動(dòng)注入依賴關(guān)系。
Spring提供了多種自動(dòng)裝配方式,autowire屬性常用的取值如下所示
- no 不使用自動(dòng)裝配。Bean依賴關(guān)系必須通過property元素定義
- byType 根據(jù)屬性類型自動(dòng)裝配。BeanFactory查找容器中的全部Bean,如果正好有一個(gè)與依賴屬性類型相同的Bean,就自動(dòng)裝配這個(gè)屬性;如果有多個(gè)這樣的Bean,Spring無(wú)法決定注入哪個(gè)Bean,就拋出一個(gè)致命異常;如果沒有匹配的Bean,就什么都不會(huì)發(fā)生,屬性不會(huì)被設(shè)置
- byName 根據(jù)屬性名自動(dòng)裝配。BeanFactory查找容器中的全部Bean,找出id與屬性的setter方法入?yún)⑵ヅ涞腂ean。找到即自動(dòng)注入,否則什么都不做
- constructor 與byType的方式類似,不同之處在于它應(yīng)用于構(gòu)造器參數(shù)。如果在容器中沒有找到與構(gòu)造器參數(shù)類型一致的Bean,那么將會(huì)拋出異常
在Spring配置文件中通過<bean>元素的autowire屬性可以實(shí)現(xiàn)自動(dòng)裝配。但是,如果要配置的Bean很多,每個(gè)Bean都配置autowire屬性也會(huì)很繁瑣,可不可以統(tǒng)一設(shè)置自動(dòng)注入而不必分別配置每個(gè)Bean呢?
三、設(shè)置全局自動(dòng)裝配
<beans>元素提供了default-autowire屬性。可以使用上面列出的屬性值為<beeas>設(shè)置default-autowire屬性以影響全局。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" default-autowire="byName"> </beans>
在<beans>節(jié)點(diǎn)上設(shè)置default-autowired時(shí),依然可以為<bean>節(jié)點(diǎn)設(shè)置autowire屬性。這時(shí)該<bean>節(jié)點(diǎn)上的自動(dòng)裝配設(shè)置將覆蓋全局設(shè)置,成為該Bean的自動(dòng)裝配策略。
對(duì)于大型的應(yīng)用,不鼓勵(lì)使用自動(dòng)裝配。雖然使用自動(dòng)裝配可以減少配置工作量,但也大大降低了依賴關(guān)系的清晰性和透明性。依賴關(guān)系的裝配僅依賴于源文件的屬性名或類型,導(dǎo)致Bean和Bean之間的耦合降低到代碼層次,不利于高層次解耦合。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java發(fā)送短信系列之限制日發(fā)送次數(shù)
這篇文章主要為大家詳細(xì)介紹了java發(fā)送短信系列之限制日發(fā)送次數(shù),詳細(xì)介紹了限制每日向同一個(gè)用戶(根據(jù)手機(jī)號(hào)和ip判斷)發(fā)送短信次數(shù)的方法,感興趣的小伙伴們可以參考一下2016-02-02Java圖形用戶界面設(shè)計(jì)(Swing)的介紹
看到多數(shù)人提到 Java 就以為是網(wǎng)絡(luò)開發(fā),其實(shí)不是這樣的,Java 也可以開發(fā)應(yīng)用程序,而且可以開發(fā)出漂亮的圖形用戶界面的應(yīng)用程序,因此,我寫下這篇文章,希望能帶你進(jìn)入 Java 圖形用戶界面設(shè)計(jì)之門。2016-07-07Hibernate初體驗(yàn)及簡(jiǎn)單錯(cuò)誤排除代碼詳解
這篇文章主要介紹了Hibernate初體驗(yàn)及簡(jiǎn)單錯(cuò)誤排除代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02MyBatisPlus+Lombok實(shí)現(xiàn)分頁(yè)功能的方法詳解
Lombok是一個(gè)Java類庫(kù),提供了一組注解,簡(jiǎn)化POJO實(shí)體類開發(fā)。本文將為大家介紹一下Lombok的使用以及如何利用MyBatisPlus+Lombok實(shí)現(xiàn)分頁(yè)功能,感興趣的可以動(dòng)手嘗試一下2022-07-07深入理解SpringBoot中關(guān)于Mybatis使用方法
這篇文章主要介紹了SpringBoot中關(guān)于Mybatis使用方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-03-03自己動(dòng)手用Springboot實(shí)現(xiàn)仿百度網(wǎng)盤的實(shí)踐
本項(xiàng)目基于Springboot開發(fā)實(shí)現(xiàn),前端采用BootStrap開發(fā)實(shí)現(xiàn),模仿百度網(wǎng)盤實(shí)現(xiàn)相關(guān)功能,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Java 數(shù)組內(nèi)置函數(shù)toArray詳解
這篇文章主要介紹了Java 數(shù)組內(nèi)置函數(shù)toArray詳解,文本詳細(xì)的講解了toArray底層的代碼和文檔,需要的朋友可以參考下2021-06-06Java?IO網(wǎng)絡(luò)模型實(shí)現(xiàn)解析
這篇文章主要為大家介紹了Java?IO網(wǎng)絡(luò)模型實(shí)現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03