大家好,我是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
視頻:
PPT:https://ptteng.github.io/PPT/PPT-java/SpringIOCYYJ.html#/