詳解Spring依賴注入的三種方式使用及優(yōu)缺點(diǎn)
前置說(shuō)明:這里的代碼演示都是在UserController類里面使用UserService類,然后通過(guò)啟動(dòng)類調(diào)用UserController類,觀察在UserController中是否通過(guò)三種依賴注入的方式獲取到UserService對(duì)象,UserService代碼及啟動(dòng)類(App)代碼如下:
@Service public class UserService { public void sayHi() { System.out.println("do userService sayHi()"); } }
public class App { public static void main(String[] args) { //1.獲取 Spring 上下文對(duì)象 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //2.獲取 Bean 對(duì)象 UserController userController = context.getBean("userController", UserController.class); //3.使用 Bean 對(duì)象 userController.sayHi(); } }
一,屬性注入
1,屬性注入的使用
屬性注入針對(duì)于屬性,將需要注入的Bean對(duì)象(這里是UserService)加上@Autowired注解(該單詞的意思為自動(dòng)注入),此時(shí)就可以將該對(duì)象從Spring容器中取出(前提必須加上五大類注解,否則Spring容器中不會(huì)有這個(gè)對(duì)象)
2,屬性注入的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
屬性注入只需要在屬性上面加一個(gè)@AutoWired注解,寫法簡(jiǎn)便,可讀性高,易維護(hù)(絕大部分實(shí)際開發(fā)中使用的都是屬性注入的方式)
缺點(diǎn):
- 不能注入final類修飾的屬性;
- 屬性注入兼容度差,只能在IoC容器中才能使用(類與IoC容器高度耦合),使用其他框架時(shí)不能使用屬性注入;
- 屬性注入容器違背單一職責(zé)原則(單一職責(zé)原則:一個(gè)類最好只能做一件事,功能最好是單一的,在屬性注入這里指的就是一個(gè)類最好只注入一個(gè)屬性),因?yàn)閷傩宰⑷牒?jiǎn)單方便的優(yōu)勢(shì),開發(fā)者在開發(fā)的過(guò)程中就容易濫用屬性注入,導(dǎo)致一個(gè)類中注入多個(gè)對(duì)象.
二,Setter注入
1,setter注入的使用
Setter注入就是使用Java的setter方法配合注解將Bean注入到當(dāng)前類中;
Setter注入針對(duì)于setter方法,通過(guò)方法將Bean對(duì)象從Spring中獲取到并進(jìn)行賦值(前提必須加上五大類注解,否則Spring容器中不會(huì)有這個(gè)對(duì)象)
2,Setter注入的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
Setter注入滿足單一設(shè)計(jì)職責(zé)原則:因?yàn)閟etter方法的特性就是一個(gè)setter方法只對(duì)應(yīng)一個(gè)對(duì)象,不會(huì)有注入多個(gè)對(duì)象的可能性;
缺點(diǎn):
- 不能注入final修飾的對(duì)象;
- 注入的對(duì)象可能會(huì)被修改:由于setter方法可以被多次調(diào)用,可能存在被修改的風(fēng)險(xiǎn);
三,構(gòu)造方法注入
1,構(gòu)造方法的使用
構(gòu)造方法顧名思義針對(duì)于構(gòu)造方法,在構(gòu)造方法上面加上注解將Bean對(duì)象注入到當(dāng)前類中(前提必須加上五大類注解,否則Spring容器中不會(huì)有這個(gè)對(duì)象)
2,構(gòu)造方法的特點(diǎn)(不同于其他兩種注入方式)
當(dāng)類中只有一個(gè)吻構(gòu)造方法時(shí)可以省略@Autowired,當(dāng)有多個(gè)構(gòu)造方法時(shí)不可以省略,否則會(huì)報(bào)錯(cuò)(因?yàn)槎鄠€(gè)構(gòu)造方法時(shí)不知道默認(rèn)給哪個(gè)構(gòu)造方法加注解);
3,構(gòu)造方法注入的有優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 能夠注入final修飾的對(duì)象;
- 注入的對(duì)象不會(huì)被修改:因?yàn)闃?gòu)造方法只會(huì)被執(zhí)行一次;
- 構(gòu)造方法注入是完全初始化的:因?yàn)橐蕾囎⑷胧窃跇?gòu)造方法內(nèi)部執(zhí)行的,而構(gòu)造方法又是在類起初創(chuàng)建的時(shí)候就執(zhí)行的,所以會(huì)被完全初始化;
- 通用性更好:構(gòu)造方法注入因?yàn)榛贘ava的,JDK是最底層框架,所以無(wú)論在哪一個(gè)框架都可以適用.
缺點(diǎn):
- 構(gòu)造方法可以注入多個(gè)對(duì)象,違背了單一設(shè)計(jì)原則(假設(shè)這里再添加一個(gè)StudentService對(duì)象觀察是否可以通過(guò)構(gòu)造方法注入):
- 構(gòu)造方法的寫法較為麻煩.
四,final對(duì)象能否被注入的原因
Java規(guī)定被final修飾的屬性只能在兩個(gè)地方進(jìn)行賦值:
- 在定義的時(shí)候就進(jìn)行賦值
- 在構(gòu)造方法內(nèi)部進(jìn)行賦值
屬性注入和Setter方法注入都沒(méi)有在定義的時(shí)候賦值(屬性注入沒(méi)有進(jìn)行賦值,Setter方法注入是通過(guò)setter這個(gè)普通方法進(jìn)行的賦值),構(gòu)造方法則是通過(guò)構(gòu)造方法進(jìn)行了賦值,所以前兩個(gè)不能注入final修飾的類,后者可以!
以上就是詳解Spring依賴注入的三種方式使用及優(yōu)缺點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于pring依賴注入方式及優(yōu)缺點(diǎn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談collection標(biāo)簽的oftype屬性能否為java.util.Map
這篇文章主要介紹了collection標(biāo)簽的oftype屬性能否為java.util.Map,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí)
這篇文章主要為大家介紹了Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07學(xué)生視角看Java 面向?qū)ο蟮睦^承本質(zhì)
繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石,因?yàn)樗试S創(chuàng)建分等級(jí)層次的類。繼承就是子類繼承父類的特征和行為,使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為2022-03-03通過(guò)使用Byte?Buddy便捷創(chuàng)建Java?Agent
這篇文章主要為大家介紹了如何通過(guò)使用Byte?Buddy便捷創(chuàng)建Java?Agent的使用說(shuō)明,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03springboot+vue實(shí)現(xiàn)Minio文件存儲(chǔ)的示例代碼
本文主要介紹了springboot+vue實(shí)現(xiàn)Minio文件存儲(chǔ)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02