詳解Spring依賴注入的三種方式使用及優(yōu)缺點(diǎn)
前置說明:這里的代碼演示都是在UserController類里面使用UserService類,然后通過啟動類調(diào)用UserController類,觀察在UserController中是否通過三種依賴注入的方式獲取到UserService對象,UserService代碼及啟動類(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 上下文對象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2.獲取 Bean 對象
UserController userController = context.getBean("userController", UserController.class);
//3.使用 Bean 對象
userController.sayHi();
}
}一,屬性注入
1,屬性注入的使用

屬性注入針對于屬性,將需要注入的Bean對象(這里是UserService)加上@Autowired注解(該單詞的意思為自動注入),此時就可以將該對象從Spring容器中取出(前提必須加上五大類注解,否則Spring容器中不會有這個對象)

2,屬性注入的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
屬性注入只需要在屬性上面加一個@AutoWired注解,寫法簡便,可讀性高,易維護(hù)(絕大部分實(shí)際開發(fā)中使用的都是屬性注入的方式)
缺點(diǎn):
- 不能注入final類修飾的屬性;

- 屬性注入兼容度差,只能在IoC容器中才能使用(類與IoC容器高度耦合),使用其他框架時不能使用屬性注入;
- 屬性注入容器違背單一職責(zé)原則(單一職責(zé)原則:一個類最好只能做一件事,功能最好是單一的,在屬性注入這里指的就是一個類最好只注入一個屬性),因?yàn)閷傩宰⑷牒唵畏奖愕膬?yōu)勢,開發(fā)者在開發(fā)的過程中就容易濫用屬性注入,導(dǎo)致一個類中注入多個對象.
二,Setter注入
1,setter注入的使用
Setter注入就是使用Java的setter方法配合注解將Bean注入到當(dāng)前類中;

Setter注入針對于setter方法,通過方法將Bean對象從Spring中獲取到并進(jìn)行賦值(前提必須加上五大類注解,否則Spring容器中不會有這個對象)

2,Setter注入的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
Setter注入滿足單一設(shè)計職責(zé)原則:因?yàn)閟etter方法的特性就是一個setter方法只對應(yīng)一個對象,不會有注入多個對象的可能性;

缺點(diǎn):
- 不能注入final修飾的對象;

- 注入的對象可能會被修改:由于setter方法可以被多次調(diào)用,可能存在被修改的風(fēng)險;
三,構(gòu)造方法注入
1,構(gòu)造方法的使用

構(gòu)造方法顧名思義針對于構(gòu)造方法,在構(gòu)造方法上面加上注解將Bean對象注入到當(dāng)前類中(前提必須加上五大類注解,否則Spring容器中不會有這個對象)

2,構(gòu)造方法的特點(diǎn)(不同于其他兩種注入方式)
當(dāng)類中只有一個吻構(gòu)造方法時可以省略@Autowired,當(dāng)有多個構(gòu)造方法時不可以省略,否則會報錯(因?yàn)槎鄠€構(gòu)造方法時不知道默認(rèn)給哪個構(gòu)造方法加注解);


3,構(gòu)造方法注入的有優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 能夠注入final修飾的對象;

- 注入的對象不會被修改:因?yàn)闃?gòu)造方法只會被執(zhí)行一次;
- 構(gòu)造方法注入是完全初始化的:因?yàn)橐蕾囎⑷胧窃跇?gòu)造方法內(nèi)部執(zhí)行的,而構(gòu)造方法又是在類起初創(chuàng)建的時候就執(zhí)行的,所以會被完全初始化;
- 通用性更好:構(gòu)造方法注入因?yàn)榛贘ava的,JDK是最底層框架,所以無論在哪一個框架都可以適用.
缺點(diǎn):
- 構(gòu)造方法可以注入多個對象,違背了單一設(shè)計原則(假設(shè)這里再添加一個StudentService對象觀察是否可以通過構(gòu)造方法注入):

- 構(gòu)造方法的寫法較為麻煩.
四,final對象能否被注入的原因
Java規(guī)定被final修飾的屬性只能在兩個地方進(jìn)行賦值:
- 在定義的時候就進(jìn)行賦值
- 在構(gòu)造方法內(nèi)部進(jìn)行賦值
屬性注入和Setter方法注入都沒有在定義的時候賦值(屬性注入沒有進(jìn)行賦值,Setter方法注入是通過setter這個普通方法進(jìn)行的賦值),構(gòu)造方法則是通過構(gòu)造方法進(jìn)行了賦值,所以前兩個不能注入final修飾的類,后者可以!
以上就是詳解Spring依賴注入的三種方式使用及優(yōu)缺點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于pring依賴注入方式及優(yōu)缺點(diǎn)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mybatis-plus?插入修改配置默認(rèn)值的實(shí)現(xiàn)方式
這篇文章主要介紹了mybatis-plus?插入修改配置默認(rèn)值的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
解決springboot集成rocketmq關(guān)于tag的坑
這篇文章主要介紹了解決springboot集成rocketmq關(guān)于tag的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
MyEclipse打開文件跳轉(zhuǎn)到notepad打開問題及解決方案
windows系統(tǒng)打開README.md文件,每次都需要右鍵選擇notepad打開,感覺很麻煩,然后就把README.md文件打開方式默認(rèn)選擇了notepad,這樣每次雙擊就能打開,感覺很方便,這篇文章主要介紹了MyEclipse打開文件跳轉(zhuǎn)到notepad打開問題,需要的朋友可以參考下2024-03-03
SpringTask-Timer實(shí)現(xiàn)定時任務(wù)的詳細(xì)代碼
在項目中開發(fā)定時任務(wù)應(yīng)該一種比較常見的需求,今天通過示例代碼給大家講解SpringTask-Timer實(shí)現(xiàn)定時任務(wù)的相關(guān)知識,感興趣的朋友一起看看吧2024-06-06

