spring中對(duì)象注入的三種實(shí)現(xiàn)方式
本文主要介紹了對(duì)象注入的實(shí)現(xiàn),分享給大家,具體如下:
一,實(shí)現(xiàn)方式的使用
對(duì)象注入也可被稱為對(duì)象裝配,是把Bean對(duì)象獲取出來放到某個(gè)類中。
對(duì)象注入的實(shí)現(xiàn)方式有3種,分別為屬性注入,Setter注入和構(gòu)造方法注入。
為了更好地理解對(duì)象注入的實(shí)現(xiàn)方式,搞個(gè)實(shí)例來具體說明:
1.0,前期準(zhǔn)備
1,準(zhǔn)備Service類
@Service public class StudentService { public void sayHi(){ System.out.println("do student service sayHi()"); } }
示例問題:將 Service 類注入到 Controller 類中,對(duì)象注入實(shí)現(xiàn):
1.1,屬性注入
1,方式對(duì)應(yīng)實(shí)現(xiàn)的Controller 類代碼:
@Controller public class StudentController { //注入方式:屬性注入 @Autowired private StudentService studentService; public void sayHi(){ System.out.println("do student controller sayHi()"); studentService.sayHi(); } }
2,啟動(dòng)類實(shí)現(xiàn)代碼:
public class App { public static void main(String[] args) { //1,獲取Spring上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); //2,得到Bean對(duì)象 StudentController studentController = applicationContext.getBean("studentController",StudentController.class); //3,使用Bean對(duì)象 studentController.sayHi(); } }
3,啟動(dòng)類執(zhí)行結(jié)果:
1.2,Setter注入
1,方式對(duì)應(yīng)實(shí)現(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,啟動(dòng)類實(shí)現(xiàn)代碼:
public class App { public static void main(String[] args) { //1,獲取Spring上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); //2,得到Bean對(duì)象 StudentController studentController = applicationContext.getBean("studentController",StudentController.class); //3,使用Bean對(duì)象 studentController.sayHi(); } }
3,啟動(dòng)類執(zhí)行結(jié)果:
1.3,構(gòu)造方法注入
1,方式對(duì)應(yīng)實(shí)現(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,啟動(dòng)類實(shí)現(xiàn)代碼:
public class App { public static void main(String[] args) { //1,獲取Spring上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); //2,得到Bean對(duì)象 StudentController studentController = applicationContext.getBean("studentController",StudentController.class); //3,使用Bean對(duì)象 studentController.sayHi(); } }
3,啟動(dòng)類執(zhí)行結(jié)果:
二,方式的優(yōu)缺點(diǎn)分析
2.1,屬性注入
1,方式實(shí)現(xiàn)代碼:
2,方式優(yōu)點(diǎn):
實(shí)現(xiàn)簡單,易于理解和維護(hù)
3,方式缺點(diǎn):
- 不能注入不可變對(duì)象【final 修飾的變量】
- 通用性差,只適用于IoC容器,在非IoC框架中無效
- 更容易違背單一設(shè)計(jì)原則
2.2,Setter注入
1,方式實(shí)現(xiàn)代碼:
2,方式優(yōu)點(diǎn):
符合單一設(shè)計(jì)原則【每個(gè)方法只傳遞一個(gè)對(duì)象】
3,方式缺點(diǎn):
- 不能注入不可變對(duì)象【final 修飾的變量】
- 使用Setter注入的對(duì)象可能被修改
2.3,構(gòu)造方法注入
1,方式實(shí)現(xiàn)代碼:
注意:如果只有一個(gè)構(gòu)造方法,那么 @Autowired
注解可以省略。
2,方式優(yōu)點(diǎn):
- 可以注入不可變對(duì)象【final 修飾的變量】
- 注入對(duì)象不會(huì)被改變【構(gòu)造方法只執(zhí)行一次】
- 注入對(duì)象會(huì)完全被初始化
- 通用性更好,可在IoC容器中使用,也可在非IoC中使用
3,方式缺點(diǎn):
- 不符合單一設(shè)計(jì)原則【每個(gè)方法可傳遞多個(gè)對(duì)象】
三,對(duì)象注入中的問題
3.1,@Autowired 和 @Resource
在進(jìn)行類注入時(shí),除了可以使用@Autowired
注解之外,我們還可以使用@Resource
注解進(jìn)行注入。
@Autowired
和 @Resource
都是在 Spring 框架中用于注入依賴的注解,它們有以下區(qū)別:
來源不同:
@Autowired
是 Spring 框架提供的注解,通過類型進(jìn)行依賴注入。@Resource
是 JavaEE 定義的注解,通過名稱進(jìn)行依賴注入。
注入方式不同:
@Autowired
默認(rèn)按照類型匹配的方式進(jìn)行注入,如果存在多個(gè)相同類型的實(shí)例,可以結(jié)合@Qualifier
注解來指定具體實(shí)例。@Resource
默認(rèn)按照名稱匹配的方式進(jìn)行注入,它支持使用name
或type
屬性來指定名稱或類型進(jìn)行匹配。
支持的類型不同:
@Autowired
支持通過構(gòu)造方法注入、屬性注入、Setter 注入的方式實(shí)現(xiàn)依賴注入。@Resource
支持通過屬性注入、Setter 注入的方式實(shí)現(xiàn)依賴注入,不支持構(gòu)造方法注入。
應(yīng)用范圍不同:
@Autowired
主要用于 Spring 框架中的組件(如 Spring Bean)的依賴注入。@Resource
是 JavaEE 規(guī)范中的注解,它可以用于依賴注入和資源的獲取,對(duì)于不依賴于 Spring 框架的應(yīng)用也可以使用。
3.2,同類型多個(gè) @Bean 報(bào)錯(cuò)
當(dāng)出現(xiàn)多個(gè) Bean 返回同?對(duì)象類型時(shí),程序會(huì)報(bào)錯(cuò)。解決同一個(gè)類型,多個(gè)bean的解決方案有以下兩個(gè):
1,使用 @Resource(name="")
2,搭配 @Autowired
使用 @Qualifierr(value = "")
核心總結(jié)
1,三種對(duì)象注入的實(shí)現(xiàn)方式以及優(yōu)缺點(diǎn)?
屬性注入,Setter注入和構(gòu)造方法注入是在依賴注入中常用的三種方式,它們各有優(yōu)缺點(diǎn):
1,屬性注入方式:其實(shí)現(xiàn)簡單,易于理解和維護(hù),但是其不能注入不可變對(duì)象,只適用于IoC容器,并且違反單一設(shè)計(jì)原則的概率大。
2,Setter注入方式:其符合單一設(shè)計(jì)原則,但是其不能注入不可變對(duì)象,并且使用Setter注入的對(duì)象可能被修改。
3,構(gòu)造方法注入方式:其可以注入不可變對(duì)象,注入的對(duì)象不能被改變,保證注入對(duì)象完全被初始化,并且具有通用性,但是其不符合單一設(shè)計(jì)原則。
注意:在上述的三種對(duì)象注入的實(shí)現(xiàn)方式中,構(gòu)造方法注入是Spring推薦的注入方式。
思考:為什么構(gòu)造方法可以注入不可變變量,而屬性注入和Setter注入?yún)s不行呢?
解答:在 Java 中,被final
修飾的對(duì)象,要么直接進(jìn)行賦值,要么就在構(gòu)造方法中進(jìn)行賦值,兩種情況必須滿足一個(gè),否則方式報(bào)錯(cuò)。
2,@Autowired 和 @Resource 注入注解的區(qū)別?
@Autowired
和 @Resource
都是在 Spring 框架中用于注入依賴的注解,它們有以下區(qū)別:
1,來源不同:@Autowired
是 Spring 框架提供的注解,而@Resource
是 JavaEE 定義的注解。
2,注入方式不同:@Autowired
默認(rèn)按照類型匹配的方式進(jìn)行注入,而@Resource
默認(rèn)按照名稱匹配的方式進(jìn)行注入。
3,支持的類型不同:@Resource
支持通過屬性注入、Setter 注入的方式實(shí)現(xiàn)依賴注入,不支持構(gòu)造方法注入,而@Autowired
支持。
4,應(yīng)用范圍不同:@Autowired
主要用于 Spring 框架中的組件的依賴注入,而@Resource
對(duì)于不依賴于 Spring 框架的應(yīng)用也可使用。
3,同類型多個(gè) @Bean 報(bào)錯(cuò)的解決方案有哪些?
解決同一個(gè)類型 @Bean 報(bào)錯(cuò)的解決方案有以下兩個(gè):
使用 @Resource(name="")
使用 @Qualifierr(value = "")
【搭配@Autowired使用】 結(jié)語
到此這篇關(guān)于spring中對(duì)象注入的三種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)spring 對(duì)象注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java8的default和static關(guān)鍵字的使用講解
今天小編就為大家分享一篇關(guān)于Java8的default和static關(guān)鍵字的使用講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01SpringBoot中調(diào)用通用URL的實(shí)現(xiàn)
在 Spring Boot 應(yīng)用程序中,有時(shí)候我們需要調(diào)用一些通用的 URL 接口,本文主要介紹了SpringBoot中調(diào)用通用URL的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07IDEA中設(shè)置代碼自動(dòng)提示為Alt+/的具體做法
很多公司都強(qiáng)制性要求使用Intellij?IDEA,其實(shí)Intellij?IDEA也確實(shí)很好用,但是一下子從Eclipse跳轉(zhuǎn)到Intellij?IDEA轉(zhuǎn)也是需要一段時(shí)間的,為了迎合之前的習(xí)慣,就需要在Intellij?IDEA中改變一些設(shè)置,如代碼自動(dòng)生成,本文給大家分享設(shè)置方法,感興趣的朋友一起看看吧2023-01-01Java網(wǎng)絡(luò)編程之基于TCP協(xié)議
本文主要將Java基于TCP的網(wǎng)絡(luò)編程主要分解成5個(gè)功能:功能分解1:單向通信功能分解,2:雙向通信功能分解,3:對(duì)象流傳送功能分解,4:加入完整的處理異常方式功能分解,5:多線程接收用戶請(qǐng)求,需要的朋友可以參考下2021-05-05淺談Java中BIO、NIO和AIO的區(qū)別和應(yīng)用場景
這篇文章主要介紹了Java中BIO、NIO和AIO的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04