电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解SpringIOC容器相關(guān)知識(shí)

瀏覽:6日期:2023-07-15 10:56:45
目錄一、前言二、IOC原理實(shí)戰(zhàn)三、IOC本質(zhì)四、spring helloworld五、小結(jié)一、前言

IOC控制反轉(zhuǎn),不是一種技術(shù),而是一種設(shè)計(jì)思想,就是將原本在程序中手動(dòng)創(chuàng)建對象的控制權(quán),交給Spring框架來管理。

區(qū)別:

沒有IOC的思路:若要使用某個(gè)對象,就必須自己負(fù)責(zé)去寫對象的創(chuàng)建 IOC的思路:若要使用某個(gè)對象,只需要從Spring容器中獲取需要使用的對象,不關(guān)心對象的創(chuàng)建過程,也就是把創(chuàng)建對象的控制權(quán)交給了Spring框架。 好萊塢法則:Don’t call me, I ’ll call you

舉例說明:

做菜,做蒜薹炒豬肉

你有兩種做法:

第一種,自己養(yǎng)豬,然后種蒜薹。等到豬長大了,你就可以殺豬,蒜薹成熟了,就收割。然后開始炒,做成了蒜薹炒豬肉。

第二種,從農(nóng)貿(mào)市場獲取豬和蒜薹,拿回來直接炒,做成了蒜薹炒豬肉。

此時(shí)的IOC就相當(dāng)于這個(gè)農(nóng)貿(mào)市場,我要做菜,我去農(nóng)貿(mào)市場拿過來就可以了,而不需要自己去弄。為什么要Java對象放到容器里?因?yàn)槲覀円龅侥脕砑从茫阌诠芾?。那你能管理農(nóng)貿(mào)市場嗎?你不能,那誰來管農(nóng)貿(mào)市場?Spring!這就是控制反轉(zhuǎn)IOC,我們把控制權(quán)交給了Spring框架,他來幫我們管這個(gè)農(nóng)貿(mào)市場,他來養(yǎng)豬,他來種菜。我們只需在要菜的時(shí)候,去市場買就好了。

再舉一個(gè)例子

過年了,想要給家里打掃個(gè)衛(wèi)生,你想請幾個(gè)鐘點(diǎn)工來打掃。也有兩種做法。

第一種:自己主動(dòng)找,找身邊人看看誰認(rèn)識(shí)鐘點(diǎn)工,你自己打電話邀約,談價(jià)格

第二種:直接找家政公司,直接提出需求即可。

第一種方式就是我們自己創(chuàng)建對象的方式,自己主動(dòng)new幾個(gè)鐘點(diǎn)工。而第二種就是spring給我們提供的IOC方式,家政公司就是一個(gè)容器,能給我提供很多的服務(wù),鐘點(diǎn)工對象是spring幫我們創(chuàng)建的。

又過了幾天,我又想給廚房的油煙機(jī)清理一下,也能直接打電話給家政公司,提出需求。

那上述例子中的農(nóng)貿(mào)市場和家政公司哪里來???

我們可以自己構(gòu)建,就像自己成立一個(gè)公司一樣。具體在程序中表現(xiàn)為:

1.使用配置文件或者注解的方式定義一下我們自己容器里存放的東西。

或者去別人的公司里找。具體在程序中表現(xiàn)為:

2.一定有很多人創(chuàng)建了自己的公司,這些服務(wù)都可以集成在我們自己的容器里,為我們提供強(qiáng)大的功能,比如spring自帶很多的template模板類。

二、IOC原理實(shí)戰(zhàn)

首先在pom.xml文件中加入spring的相關(guān)jar包。

<dependencies> <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version> </dependency></dependencies>

我們定義我們的接口和實(shí)現(xiàn)類

// UserDao接口public interface UserDao { void getUser();}// UserDao實(shí)現(xiàn)類1,mysql實(shí)現(xiàn)public class UserDaoImpl implements UserDao { public void getUser() {System.out.println('mysql實(shí)現(xiàn)'); }}// UserDao實(shí)現(xiàn)類2,oracle實(shí)現(xiàn)public class UserDaoImpl implements UserDao { public void getUser() {System.out.println('oracle實(shí)現(xiàn)'); }}

然后我們的業(yè)務(wù)實(shí)現(xiàn)類,在不使用set注入的情況下,是這樣的:

//業(yè)務(wù)接口public interface UserService { void getUser();}//業(yè)務(wù)實(shí)現(xiàn)類public class UserServiceImpl implements UserService { //傳統(tǒng)的方法中,如果這邊要改變,那就必須將這里的語句改變才可以 private UserDao userDao = new UserDaoImpl(); public void getUser() {userDao.getUser(); }}

對應(yīng)的測試類:

public class MyTest { public static void main(String[] args) {//用戶實(shí)際調(diào)用的是業(yè)務(wù)層,不需要接觸dao層UserServiceImpl userService =new UserServiceImpl();userService.getUser(); }}

但是你會(huì)發(fā)現(xiàn)使用這種方法如果我在測試這里想用oracle實(shí)現(xiàn),那就必須新增一個(gè)業(yè)務(wù)實(shí)現(xiàn)類或者修改我原本的業(yè)務(wù)實(shí)現(xiàn)類,違反了開閉原則。

所以我們的業(yè)務(wù)實(shí)現(xiàn)類要使用set方法動(dòng)態(tài)注入我們的UserDao實(shí)現(xiàn)類。

public class UserServiceImpl implements UserService { private UserDao userDao; // 利用set進(jìn)行動(dòng)態(tài)實(shí)現(xiàn)值的注入 public void setUserDao(UserDao userDao) {this.userDao = userDao; } public void getUser() {userDao.getUser(); }}

如此一來只需要在測試類中通過set方法,傳入對應(yīng)的實(shí)現(xiàn)類對象,就可以實(shí)現(xiàn)調(diào)用不同的實(shí)現(xiàn)對象的getUser方法。

public class MyTest { public static void main(String[] args) {// 利用set注入的方法,我們可以不需要修改service中的代碼,從而實(shí)現(xiàn)多個(gè)不同對象的getUser方法UserServiceImpl userService = new UserServiceImpl();userService.setUserDao(new UserDaoImpl());userService.getUser();//mysql實(shí)現(xiàn)userService.setUserDao(new UserDaoOracleImpl());userService.getUser();//oracle實(shí)現(xiàn) }}

這兩種模式的區(qū)別可以發(fā)現(xiàn)。之前,控制UserDao實(shí)現(xiàn)類的控制權(quán),在程序員手上,程序員寫在UserServiceImpl里,寫死了對應(yīng)的是實(shí)現(xiàn)類,如果要修改的話,程序員就必須去修改對應(yīng)的代碼。而后面這種方法,控制UserDao實(shí)現(xiàn)類的控制權(quán),就已經(jīng)不在程序員手上了。現(xiàn)在程序是被動(dòng)接收對象,然后動(dòng)態(tài)set注入實(shí)現(xiàn)了可以隨意使用不同的實(shí)現(xiàn)類的getUser方法。

這其實(shí)就是一種控制反轉(zhuǎn)IOC的原型。這種思想從本質(zhì)上解決了問題,程序員不用再去管理對象的創(chuàng)建了。系統(tǒng)的耦合性大大降低??梢愿訉W⒌脑跇I(yè)務(wù)的實(shí)現(xiàn)上。spring的底層全部都是基于這種思想去實(shí)現(xiàn)的。

三、IOC本質(zhì)

詳解SpringIOC容器相關(guān)知識(shí)

像上圖所示,IOC本質(zhì)上就是把左邊變成了右邊。本來是業(yè)務(wù)層里程序員寫來主動(dòng)決定調(diào)用的下面的Mysql還是Oracle,但是現(xiàn)在通過IOC,可以把主動(dòng)權(quán)交給用戶,讓用戶想用Mysql用Mysql,想用Oracle就用Oracle。

DI(依賴注入)是實(shí)現(xiàn)IOC的一種方法,在沒有IOC的程序中,我們使用面向?qū)ο缶幊蹋瑢ο蟮膭?chuàng)建與對象間的依賴關(guān)系完全硬編碼再程序中,對象的創(chuàng)建由程序自己控制(也就是程序員自己寫),控制反轉(zhuǎn)(IOC)后將對象的創(chuàng)建移交給第三方了,控制反轉(zhuǎn)的這個(gè)反轉(zhuǎn)說的就是獲得依賴對象的方式反轉(zhuǎn)了。

采用XML配置方式配置Bean的時(shí)候,Bean的定義信息和實(shí)現(xiàn)是分離的,而采用注解的方式的時(shí)候兩者是合為一體的,Bean的定義信息直接以注解的形式定義在實(shí)現(xiàn)類中,從而達(dá)到了零配置的目睹。

控制反轉(zhuǎn)是一種通過描述(XML或者注解)并通過第三方去生產(chǎn)或獲得特定對象的方式。在Spring中實(shí)現(xiàn)控制反轉(zhuǎn)的是IOC容器,其實(shí)現(xiàn)方式是依賴注入(Dependency Injection,DI)

四、spring helloworld

找到1.2.2實(shí)例化容器部分,發(fā)現(xiàn)了其配置文件格式:

詳解SpringIOC容器相關(guān)知識(shí)

首先創(chuàng)建我們的實(shí)體類Hello:

package com.hj.pojo;public class Hello { private String str; public String getStr() {return str; } public void setStr(String str) {this.str = str; } @Override public String toString() {return 'Hello{' +'str=’' + str + ’’’ +’}’; }}

然后根據(jù)文檔中所述,在resources文件下創(chuàng)建beans.xml文件來使用spring創(chuàng)建對象。beans.xml內(nèi)容如下:

<?xml version='1.0' encoding='UTF-8'?><beans xmlns='http://www.springframework.org/schema/beans' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd'> <!--使用spring來創(chuàng)建對象,在spring中這些都稱為bean bean = 對象 相當(dāng)于 new Hello(); 正常是 類型 變量名 = new 類型(); Hello hello = new Hello(); 利用bean來實(shí)現(xiàn),id就是變量名,class就是我們對象的類型 里面的property相當(dāng)于給對象中的屬性設(shè)置一個(gè)值。 --> <bean class='com.hj.pojo.Hello'><!--ref:引用spring容器中創(chuàng)建好的對象value:具體的值,基本數(shù)據(jù)類型--><property name='str' value='Spring'/> </bean></beans>

再次查看官方文檔,查詢?nèi)绾问褂萌萜鳌?/p>

詳解SpringIOC容器相關(guān)知識(shí)

可以看到需要借助一個(gè)工廠來讀取bean的定義并進(jìn)行訪問,然后創(chuàng)建對象。

import com.hj.pojo.Hello;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest { public static void main(String[] args) {//獲取spring的上下文對象ApplicationContext context = new ClassPathXmlApplicationContext('beans.xml');//我們的對象現(xiàn)在都在spring中管理了,我們要使用,直接去取出來就可以了Hello hello = (Hello) context.getBean('hello');System.out.println(hello.toString());//Hello{str=’Spring’}//思考?//Hello對象是誰創(chuàng)建的?是由Spring創(chuàng)建的//Hello對象的屬性是怎么設(shè)置的?是由Spring容器設(shè)置的 }}

這個(gè)Hello對象由spring創(chuàng)建并且由spring容器設(shè)置屬性的過程就是控制反轉(zhuǎn)。

五、小結(jié)

控制:誰來控制對象的創(chuàng)建,傳統(tǒng)的應(yīng)用程序的對象是由程序本身控制創(chuàng)建的,使用spring后,對象是由spring來創(chuàng)建的。

反轉(zhuǎn):程序本身不創(chuàng)建對象,而變成被動(dòng)的接收對象

依賴注入:就是利用set方法來進(jìn)行注入

IOC是一種編程思想,由主動(dòng)的編程去變成被動(dòng)的接收。

我們回頭看Hello類里左邊有個(gè)豆子的標(biāo)志了,這說明這個(gè)類已經(jīng)被Spring托管了。

詳解SpringIOC容器相關(guān)知識(shí)

所謂的IoC,一句話來概括:對象由spring來創(chuàng)建,管理和裝配。

到此這篇關(guān)于詳解SpringIOC和容器相關(guān)知識(shí)的文章就介紹到這了,更多相關(guān)SpringIOC和容器內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 派财经_聚焦数字经济内容服务平台 | 高温热泵烘干机,高温烘干热泵,热水设备机组_正旭热泵 | 大立教育官网-一级建造师培训-二级建造师培训-造价工程师-安全工程师-监理工程师考试培训 | 光环国际-新三板公司_股票代码:838504 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 科箭WMS仓库管理软件-TMS物流管理系统-科箭SaaS云服务 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | ptc_浴霸_大巴_干衣机_呼吸机_毛巾架_电动车加热器-上海帕克 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | Honsberg流量计-Greisinger真空表-气压计-上海欧臻机电设备有限公司 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 自动售货机_无人售货机_专业的自动售货机运营商_免费投放售货机-广州富宏主官网 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 口臭的治疗方法,口臭怎么办,怎么除口臭,口臭的原因-口臭治疗网 | 连栋温室大棚建造厂家-智能玻璃温室-薄膜温室_青州市亿诚农业科技 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 咖啡加盟-咖啡店加盟-咖啡西餐厅加盟-塞纳左岸咖啡西餐厅官网 | 卫生人才网-中国专业的医疗卫生医学人才网招聘网站! | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 塑胶地板-商用PVC地板-pvc地板革-安耐宝pvc塑胶地板厂家 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 脉冲除尘器,除尘器厂家-淄博机械| 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 电力测功机,电涡流测功机,磁粉制动器,南通远辰曳引机测试台 | 全国国际学校排名_国际学校招生入学及学费-学校大全网 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | 立式矫直机_卧式矫直机-无锡金矫机械制造有限公司 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 |