SPRING中的IOC是什么意思,為什么要用IOC而不是NEW來(lái)創(chuàng)建實(shí)例?

大家好,我是IT修真院成都分院第9期學(xué)員,一枚正直純潔善良的Java程序員。今天給大家分享一下,修真院官網(wǎng)JAVA(職業(yè))任務(wù)1的知識(shí)點(diǎn)——Spring的IOC。

1.背景介紹

眾所周知,對(duì)于剛剛接觸java的新手來(lái)說(shuō),創(chuàng)建類的對(duì)象是通過(guò)在代碼里new一個(gè)對(duì)象來(lái)實(shí)現(xiàn)的,但是這樣的方式就會(huì)造成代碼耦合度過(guò)高的問(wèn)題,雖說(shuō)程序功能實(shí)現(xiàn)沒(méi)有問(wèn)題,但是不方便修改,就是在這樣的環(huán)境下,IOC應(yīng)運(yùn)而生

2.知識(shí)剖析

首先帶大家認(rèn)識(shí)一下IOC

Ioc—Inversion of Control,即“控制反轉(zhuǎn)”

Ioc意味著將你設(shè)計(jì)好的對(duì)象交給容器控制,而不是傳統(tǒng)的在你的對(duì)象內(nèi)部直接控制

下面我們來(lái)講講Ioc的底層實(shí)現(xiàn)原理

主要用到的有以下幾種技術(shù)

(1)xml配置文件

(2)dom4j解析xml文件

(3)工廠設(shè)計(jì)模式

(4)反射

public class Factory(

//返回類對(duì)象的方法

public static User getUser(){

//1.使用dom4j解析文件

//根據(jù)第一步配置的id值得到所對(duì)應(yīng)的class的值

String classValue="class屬性值"

//2.通過(guò)反射創(chuàng)建類的對(duì)象

Class class= Class.forName(classValue);

//創(chuàng)建類對(duì)象

User user = class.newInstance();

return user;

})

屬性注入的三種方法

(1)set方法注入

(2)有參構(gòu)造方法注入

(3)接口注入

3. 常見(jiàn)問(wèn)題

(1)IOC有哪些缺點(diǎn)?

(2)IOC和DI有什么不同之處?

(3)控制反轉(zhuǎn)是控制什么反轉(zhuǎn)?

(4)依賴注入,誰(shuí)依賴誰(shuí),注入了什么?

4. 解決方案

(1)通過(guò)反射來(lái)創(chuàng)建對(duì)象,會(huì)造成效率上的損耗,但是相對(duì)IOC的優(yōu)點(diǎn)靈活性和可維護(hù)性來(lái)說(shuō)不值一提,并且缺少IDE重構(gòu)的支持,如果修改了類名,需要到xml文件里手動(dòng)修改

(2)其實(shí)是一會(huì)事,只是強(qiáng)調(diào)的內(nèi)容不同。IOC控制反轉(zhuǎn),強(qiáng)調(diào)容器的作用,用于組織或控制容器內(nèi)bean的運(yùn)行。DI依賴注入,強(qiáng)調(diào)Bean需要外部注入才能正常運(yùn)轉(zhuǎn)。

(3)它把傳統(tǒng)上由程序代碼直接操控的對(duì)象的調(diào)用權(quán)交給容器

(4)依賴注入就是把有依賴關(guān)系的類放入IOC容器中,然后解析出這個(gè)類的實(shí)例

5. 編碼實(shí)戰(zhàn)

Spring的IOC_騰訊視頻

6. 擴(kuò)展思考

在SpringMVC項(xiàng)目中,Spring創(chuàng)建的容器與SpringMVC創(chuàng)建的容器有什么關(guān)系?它們分別負(fù)責(zé)哪些bean的注冊(cè)?

7.參考文獻(xiàn)

參考一:百度

參考二:https://www.bilibili.com/video/av14839030/

參考三:知乎

8.更多討論

歡迎大家交流和討論

今天的分享就到這里啦,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)、留言、拍磚~


提問(wèn)環(huán)節(jié):

問(wèn)題①:@Autowired和@Resource的區(qū)別

@Resource標(biāo)簽: 1,@Resource標(biāo)簽是JavaEE規(guī)范的標(biāo)簽; 2,@Resource標(biāo)簽也可以作用于字段或者setter方法; 3,也可以使用@Resource標(biāo)簽注入一些spring內(nèi)置的重要對(duì)象,比如BeanFactory.ApplicationContext; 4,@Resource必須要求有匹配的對(duì)象; 5,既引入了@Autowired標(biāo)簽的解析器,也引入了@Resource的解析器;

6,@Resource標(biāo)簽找bean的方式:

1),首先按照名字去找,如果找到,就使用setter或者字段注入;

2),如果按照名字找不到,再按照類型去找,但如果找到多個(gè)匹配類型,報(bào)錯(cuò);

3),可以直接使用name屬性指定bean的名稱;但是,如果指定的name,就只能按照name去找,如果找不到,就不會(huì)再按照類型去找;

@Autowired VS @Resource:

1,@Autowired:是Spring定義的標(biāo)簽,所以不太穩(wěn)定,并且對(duì)象和spring框架關(guān)聯(lián);

2,@Resouce:是J2EE的規(guī)范,所以穩(wěn)定,在J2EE規(guī)范容器中也能正常使用;

兩者都得掌握.聽(tīng)領(lǐng)導(dǎo).

問(wèn)題②:bean類單例多例的區(qū)別.

https://www.cnblogs.com/pilihaotian/p/5810887.html

問(wèn)題③:ApplicationContext bean類生命周期

http://blog.csdn.net/ikaraide/article/details/24180641

視頻:


undefined_騰訊視頻

PPT:https://ptteng.github.io/PPT/PPT-java/SpringIOCYYJ.html#/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容