spring中對象注入的三種實現(xiàn)方式
本文主要介紹了對象注入的實現(xiàn),分享給大家,具體如下:

一,實現(xiàn)方式的使用
對象注入也可被稱為對象裝配,是把Bean對象獲取出來放到某個類中。
對象注入的實現(xiàn)方式有3種,分別為屬性注入,Setter注入和構(gòu)造方法注入。
為了更好地理解對象注入的實現(xiàn)方式,搞個實例來具體說明:
1.0,前期準(zhǔn)備
1,準(zhǔn)備Service類
@Service
public class StudentService {
public void sayHi(){
System.out.println("do student service sayHi()");
}
}示例問題:將 Service 類注入到 Controller 類中,對象注入實現(xiàn):
1.1,屬性注入
1,方式對應(yīng)實現(xiàn)的Controller 類代碼:
@Controller
public class StudentController {
//注入方式:屬性注入
@Autowired
private StudentService studentService;
public void sayHi(){
System.out.println("do student controller sayHi()");
studentService.sayHi();
}
}2,啟動類實現(xiàn)代碼:
public class App {
public static void main(String[] args) {
//1,獲取Spring上下文
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("spring-config.xml");
//2,得到Bean對象
StudentController studentController =
applicationContext.getBean("studentController",StudentController.class);
//3,使用Bean對象
studentController.sayHi();
}
}3,啟動類執(zhí)行結(jié)果:

1.2,Setter注入
1,方式對應(yīng)實現(xiàn)的Controller 類代碼:
@Controller
public class StudentController {
private StudentService studentService;
@Autowired
public void setStudentService(StudentService studentService) {
this.studentService = studentService;
}
public void sayHi(){
System.out.println("do student controller sayHi()");
studentService.sayHi();
}
}2,啟動類實現(xiàn)代碼:
public class App {
public static void main(String[] args) {
//1,獲取Spring上下文
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("spring-config.xml");
//2,得到Bean對象
StudentController studentController =
applicationContext.getBean("studentController",StudentController.class);
//3,使用Bean對象
studentController.sayHi();
}
}3,啟動類執(zhí)行結(jié)果:

1.3,構(gòu)造方法注入
1,方式對應(yīng)實現(xiàn)的Controller 類代碼:
@Controller
public class StudentController {
private StudentService studentService;
@Autowired
public StudentController(StudentService studentService) {
this.studentService = studentService;
}
public void sayHi(){
System.out.println("do student controller sayHi()");
studentService.sayHi();
}
}2,啟動類實現(xiàn)代碼:
public class App {
public static void main(String[] args) {
//1,獲取Spring上下文
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("spring-config.xml");
//2,得到Bean對象
StudentController studentController =
applicationContext.getBean("studentController",StudentController.class);
//3,使用Bean對象
studentController.sayHi();
}
}3,啟動類執(zhí)行結(jié)果:

二,方式的優(yōu)缺點分析
2.1,屬性注入
1,方式實現(xiàn)代碼:

2,方式優(yōu)點:
實現(xiàn)簡單,易于理解和維護
3,方式缺點:
- 不能注入不可變對象【final 修飾的變量】
- 通用性差,只適用于IoC容器,在非IoC框架中無效
- 更容易違背單一設(shè)計原則
2.2,Setter注入
1,方式實現(xiàn)代碼:

2,方式優(yōu)點:
符合單一設(shè)計原則【每個方法只傳遞一個對象】
3,方式缺點:
- 不能注入不可變對象【final 修飾的變量】
- 使用Setter注入的對象可能被修改
2.3,構(gòu)造方法注入
1,方式實現(xiàn)代碼:

注意:如果只有一個構(gòu)造方法,那么 @Autowired 注解可以省略。
2,方式優(yōu)點:
- 可以注入不可變對象【final 修飾的變量】
- 注入對象不會被改變【構(gòu)造方法只執(zhí)行一次】
- 注入對象會完全被初始化
- 通用性更好,可在IoC容器中使用,也可在非IoC中使用
3,方式缺點:
- 不符合單一設(shè)計原則【每個方法可傳遞多個對象】
三,對象注入中的問題
3.1,@Autowired 和 @Resource
在進行類注入時,除了可以使用@Autowired注解之外,我們還可以使用@Resource注解進行注入。

@Autowired 和 @Resource 都是在 Spring 框架中用于注入依賴的注解,它們有以下區(qū)別:
來源不同:
@Autowired是 Spring 框架提供的注解,通過類型進行依賴注入。@Resource是 JavaEE 定義的注解,通過名稱進行依賴注入。
注入方式不同:
@Autowired默認(rèn)按照類型匹配的方式進行注入,如果存在多個相同類型的實例,可以結(jié)合@Qualifier注解來指定具體實例。@Resource默認(rèn)按照名稱匹配的方式進行注入,它支持使用name或type屬性來指定名稱或類型進行匹配。
支持的類型不同:
@Autowired支持通過構(gòu)造方法注入、屬性注入、Setter 注入的方式實現(xiàn)依賴注入。@Resource支持通過屬性注入、Setter 注入的方式實現(xiàn)依賴注入,不支持構(gòu)造方法注入。
應(yīng)用范圍不同:
@Autowired主要用于 Spring 框架中的組件(如 Spring Bean)的依賴注入。@Resource是 JavaEE 規(guī)范中的注解,它可以用于依賴注入和資源的獲取,對于不依賴于 Spring 框架的應(yīng)用也可以使用。
3.2,同類型多個 @Bean 報錯
當(dāng)出現(xiàn)多個 Bean 返回同?對象類型時,程序會報錯。解決同一個類型,多個bean的解決方案有以下兩個:
1,使用 @Resource(name="")

2,搭配 @Autowired 使用 @Qualifierr(value = "")

核心總結(jié)
1,三種對象注入的實現(xiàn)方式以及優(yōu)缺點?
屬性注入,Setter注入和構(gòu)造方法注入是在依賴注入中常用的三種方式,它們各有優(yōu)缺點:
1,屬性注入方式:其實現(xiàn)簡單,易于理解和維護,但是其不能注入不可變對象,只適用于IoC容器,并且違反單一設(shè)計原則的概率大。
2,Setter注入方式:其符合單一設(shè)計原則,但是其不能注入不可變對象,并且使用Setter注入的對象可能被修改。
3,構(gòu)造方法注入方式:其可以注入不可變對象,注入的對象不能被改變,保證注入對象完全被初始化,并且具有通用性,但是其不符合單一設(shè)計原則。
注意:在上述的三種對象注入的實現(xiàn)方式中,構(gòu)造方法注入是Spring推薦的注入方式。
思考:為什么構(gòu)造方法可以注入不可變變量,而屬性注入和Setter注入?yún)s不行呢?
解答:在 Java 中,被final修飾的對象,要么直接進行賦值,要么就在構(gòu)造方法中進行賦值,兩種情況必須滿足一個,否則方式報錯。
2,@Autowired 和 @Resource 注入注解的區(qū)別?
@Autowired 和 @Resource 都是在 Spring 框架中用于注入依賴的注解,它們有以下區(qū)別:
1,來源不同:@Autowired 是 Spring 框架提供的注解,而@Resource 是 JavaEE 定義的注解。
2,注入方式不同:@Autowired 默認(rèn)按照類型匹配的方式進行注入,而@Resource 默認(rèn)按照名稱匹配的方式進行注入。
3,支持的類型不同:@Resource 支持通過屬性注入、Setter 注入的方式實現(xiàn)依賴注入,不支持構(gòu)造方法注入,而@Autowired 支持。
4,應(yīng)用范圍不同:@Autowired 主要用于 Spring 框架中的組件的依賴注入,而@Resource對于不依賴于 Spring 框架的應(yīng)用也可使用。
3,同類型多個 @Bean 報錯的解決方案有哪些?
解決同一個類型 @Bean 報錯的解決方案有以下兩個:
使用 @Resource(name="")使用 @Qualifierr(value = "") 【搭配@Autowired使用】 結(jié)語
到此這篇關(guān)于spring中對象注入的三種實現(xiàn)方式的文章就介紹到這了,更多相關(guān)spring 對象注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot集成swagger2生成接口文檔的全過程
這篇文章主要給大家介紹了關(guān)于Spring boot集成swagger2生成接口文檔的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Java并發(fā)系列之ConcurrentHashMap源碼分析
這篇文章主要為大家詳細分析了Java并發(fā)系列之ConcurrentHashMap源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
Mybatis plus Dynamic Datasource 動態(tài)數(shù)據(jù)源及使用
dynamic-datasource-spring-boot-starter是一個基于springboot的快速集成多數(shù)據(jù)源的啟動器,它跟mybatis-plus是一個生態(tài)圈里的,很容易集成mybatis-plus,本文介紹Mybatis plus Dynamic Datasource 動態(tài)數(shù)據(jù)源的相關(guān)知識,感興趣的朋友一起看看吧2025-09-09
spring Boot查詢數(shù)據(jù)分頁顯示的方法實例
這篇文章主要給大家介紹了關(guān)于spring Boot查詢數(shù)據(jù)分頁顯示的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Java并發(fā)之synchronized實現(xiàn)原理深入理解
這篇文章主要介紹了Java中synchronized實現(xiàn)原理詳解,涉及synchronized實現(xiàn)同步的基礎(chǔ),Java對象頭,Monitor,Mark Word,鎖優(yōu)化,自旋鎖等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下2021-08-08

