解析Spring核心技術(shù)IoC、AOP
B、引用類型
當(dāng)指定bean 的某屬性值為另一bean 的實(shí)例時(shí),通過ref 指定它們間的引用關(guān)系。ref 的值必須為某bean 的 id 值。
對(duì)于其它Bean 對(duì)象的引用,使用<bean/>標(biāo)簽的ref 屬性
測(cè)試方法:
(2) 構(gòu)造注入(理解)
構(gòu)造注入是指,在構(gòu)造調(diào)用者實(shí)例的同時(shí),完成被調(diào)用者的實(shí)例化。即, 使用構(gòu)造器設(shè)置依賴關(guān)系。
舉例 1:
<constructor-arg />標(biāo)簽中用于指定參數(shù)的屬性有:
name:指定參數(shù)名稱。
index:指明該參數(shù)對(duì)應(yīng)著構(gòu)造器的第幾個(gè)參數(shù),從 0 開始。不過,該屬性不要也行,但要注意,若參數(shù)類型相同,或之間有包含關(guān)系,則需要保證賦值順序要與構(gòu)造器中的參數(shù)順序一致。
舉例 2:
使用構(gòu)造注入創(chuàng)建一個(gè)系統(tǒng)類 File 對(duì)象
測(cè)試類:
引用類型屬性自動(dòng)注入
對(duì)于引用類型屬性的注入,也可不在配置文件中顯示的注入?梢酝ㄟ^為<bean/>標(biāo)簽設(shè)置autowire 屬性值,為引用類型屬性進(jìn)行隱式自動(dòng)注入(默認(rèn)是不自動(dòng)注入引用類型屬性)。根據(jù)自動(dòng)注入判斷標(biāo)準(zhǔn)的不同,可以分為兩種:
byName:根據(jù)名稱自動(dòng)注入
byType: 根據(jù)類型自動(dòng)注入
(1) byName 方式自動(dòng)注入
當(dāng)配置文件中被調(diào)用者bean 的id 值與代碼中調(diào)用者bean 類的屬性名相同時(shí),可使用byName 方式,讓容器自動(dòng)將被調(diào)用者bean 注入給調(diào)用者bean。容器是通過調(diào)用者的bean 類的屬性名與配置文件的被調(diào)用者bean 的id 進(jìn)行比較而實(shí)現(xiàn)自動(dòng)注入的。
舉例:
(2)byType 方式自動(dòng)注入
使用byType 方式自動(dòng)注入,要求:配置文件中被調(diào)用者 bean 的class 屬性指定的類,要與代碼中調(diào)用者bean 類的某引用類型屬性類型同源。即要么相同,要么有 is-a 關(guān)系(子類,或是實(shí)現(xiàn)類)。但這樣的同源的被調(diào)用bean 只能有一個(gè)。多于一個(gè),容器就不知該匹配哪一個(gè)了。
舉例:
為應(yīng)用指定多個(gè) Spring 配置文件
在實(shí)際應(yīng)用里,隨著應(yīng)用規(guī)模的增加,系統(tǒng)中Bean 數(shù)量也大量增加,導(dǎo)致配置文件變得非常龐大、臃腫。為了避免這種情況的產(chǎn)生,提高配置文件的可讀性與可維護(hù)性,可以將 Spring 配置文件分解成多個(gè)配置文件。
包含關(guān)系的配置文件:
多個(gè)配置文件中有一個(gè)總文件,總配置文件將各其它子文件通過<import/>引入。在Java 代碼中只需要使用總配置文件對(duì)容器進(jìn)行初始化即可。
舉例:
代碼:
Spring 配置文件:
也可使用通配符*。但,此時(shí)要求父配置文件名不能滿足*所能匹配的格式,否則將出現(xiàn)循環(huán)遞歸包含。就本例而言,父配置文件不能匹配 spring-*.xml 的格式,即不能起名為spring-total.xml。
基于注解的 DI
舉例:di-annotation 項(xiàng)目
對(duì)于 DI 使用注解,將不再需要在 Spring 配置文件中聲明bean 實(shí)例。Spring 中使用注解,需要在原有 Spring 運(yùn)行環(huán)境基礎(chǔ)上再做一些改變。
需要在 Spring 配置文件中配置組件掃描器,用于在指定的基本包中掃描注解。
指定多個(gè)包的三種方式:
1) 使用多個(gè)context:component-scan 指定不同的包路徑
2) 指定 base-package 的值使用分隔符
分隔符可以使用逗號(hào)(,)分號(hào)(;)還可以使用空格,不建議使用空格。
逗號(hào)分隔:
分號(hào)分隔:
3) base-package 是指定到父包名
base-package 的值表是基本包,容器啟動(dòng)會(huì)掃描包及其子包中的注解,當(dāng)然也會(huì)掃描到子包下級(jí)的子包。所以base-package 可以指定一個(gè)父包就可以。
或者最頂級(jí)的父包
但不建議使用頂級(jí)的父包,掃描的路徑比較多,導(dǎo)致容器啟動(dòng)時(shí)間變慢。指定到目標(biāo)包和合適的。也就是注解所在包全路徑。例如注解的類在com.bjpowernode.beans 包中
定義Bean 的注解@Component(掌握)
需要在類上使用注解@Component,該注解的value 屬性用于指定該bean 的 id 值。
舉例:di01
另外,Spring 還提供了 3 個(gè)創(chuàng)建對(duì)象的注解:
@Repository 用于對(duì)DAO 實(shí)現(xiàn)類進(jìn)行注解
@Service 用于對(duì)Service 實(shí)現(xiàn)類進(jìn)行注解
@Controller 用于對(duì)Controller 實(shí)現(xiàn)類進(jìn)行注解
這三個(gè)注解與@Component 都可以創(chuàng)建對(duì)象,但這三個(gè)注解還有其他的含義,@Service 創(chuàng)建業(yè)務(wù)層對(duì)象,業(yè)務(wù)層對(duì)象可以加入事務(wù)功能, @Controller 注解創(chuàng)建的對(duì)象可以作為處理器接收用戶的請(qǐng)求。
@Repository,@Service,@Controller 是對(duì)@Component 注解的細(xì)化,標(biāo)注不同層的對(duì)象。即持久層對(duì)象,業(yè)務(wù)層對(duì)象,控制層對(duì)象。
@Component 不指定value 屬性,bean 的 id 是類名的首字母小寫。
簡(jiǎn)單類型屬性注入@Value(掌握)
需要在屬性上使用注解@Value,該注解的value 屬性用于指定要注入的值。
使用該注解完成屬性注入時(shí),類中無需setter。當(dāng)然,若屬性有setter, 則也可將其加到setter 上。
舉例:
byType 自動(dòng)注入@Autowired(掌握)
需要在引用屬性上使用注解@Autowired,該注解默認(rèn)使用按類型自動(dòng)裝配Bean 的方式。
使用該注解完成屬性注入時(shí),類中無需setter。當(dāng)然若屬性有setter,則也可將其加到setter上。
舉例:
byName 自動(dòng)注入@Autowired 與@Qualifier(掌握)
需要在引用屬性上聯(lián)合使用注解@Autowired 與@Qualifier。@Qualifier 的value 屬性用于指定要匹配的Bean 的id 值。類中無需set 方法,也可加到set 方法上。
舉例:
@Autowired 還有一個(gè)屬性required,默認(rèn)值為true,表示當(dāng)匹配失敗后,會(huì)終止程序運(yùn)行。若將其值設(shè)置為false,則匹配失敗,將被忽略,未匹配的屬性值為null。
JDK 注解@Resource 自動(dòng)注入(掌握)
Spring 提供了對(duì)jdk 中@Resource 注解的支持。@Resource 注解既可以按名稱匹配Bean,也可以按類型匹配Bean。默認(rèn)是按名稱注入。使用該注 解,要求JDK 必須是 6 及以上版本。@Resource 可在屬性上,也可在set 方法上。
(1) byType 注入引用類型屬性
@Resource 注解若不帶任何參數(shù),采用默認(rèn)按名稱的方式注入,按名稱不能注入bean,則會(huì)按照類型進(jìn)行Bean 的匹配注入。
舉例:
(2) byName 注入引用類型屬性
@Resource 注解指定其name 屬性,則name 的值即為按照名稱進(jìn)行匹配的Bean 的 id。
舉例:
注解與 XML 的對(duì)比
注解優(yōu)點(diǎn)是:
方便
直觀
高效(代碼少,沒有配置文件的書寫那么復(fù)雜)。
其弊端也顯而易見:以硬編碼的方式寫入到Java 代碼中,修改是需要重新編譯代碼的。
XML 方式優(yōu)點(diǎn)是:
配置和代碼是分離的
在xml 中做修改,無需編譯代碼,只需重啟服務(wù)器即可將新的配置加載。xml 的缺點(diǎn)是:編寫麻煩,效率低,大型項(xiàng)目過于復(fù)雜。
以上Spring全套視頻|資料可私信/評(píng)論免費(fèi)獲取~~~

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-
馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-
機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-
存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬
-
長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-
豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-
字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-
員工持股爆雷?廣汽埃安緊急回應(yīng)
-
中國(guó)“智造”背后的「關(guān)鍵力量」
最新活動(dòng)更多
-
10月23日火熱報(bào)名中>> 2025是德科技創(chuàng)新技術(shù)峰會(huì)
-
10月23日立即報(bào)名>> Works With 開發(fā)者大會(huì)深圳站
-
10月24日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
即日-11.25立即下載>>> 費(fèi)斯托白皮書《柔性:汽車生產(chǎn)未來的關(guān)鍵》
-
11月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
- 1 特斯拉工人被故障機(jī)器人打成重傷,索賠3.6億
- 2 【行業(yè)深度研究】退居幕后四年后,張一鳴終于把算法公司變成AI公司?
- 3 AI 時(shí)代,阿里云想當(dāng)“安卓” ,那誰是“蘋果”?
- 4 硬剛英偉達(dá)!華為發(fā)布全球最強(qiáng)算力超節(jié)點(diǎn)和集群
- 5 機(jī)器人9月大事件|3家國(guó)產(chǎn)機(jī)器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 6 谷歌“香蕉”爆火啟示:國(guó)產(chǎn)垂類AI的危機(jī)還是轉(zhuǎn)機(jī)?
- 7 00后華裔女生靠?jī)刹緼I電影狂賺7.8億人民幣,AI正式進(jìn)軍好萊塢
- 8 美光:AI Capex瘋投不止,終于要拉起存儲(chǔ)超級(jí)周期了?
- 9 華為已殺入!AI領(lǐng)域最熱黃金賽道,大廠的數(shù)字人美女讓我一夜沒睡著覺
- 10 隱退4年后,張一鳴久違現(xiàn)身!互聯(lián)網(wǎng)大佬正集體殺回