日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

简述控制反转ioc_深度理解Spring IOC(控制反转)

發(fā)布時(shí)間:2025/3/12 javascript 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简述控制反转ioc_深度理解Spring IOC(控制反转) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、IOC概述

Inverse Of Controll即為控制反轉(zhuǎn),簡(jiǎn)稱IOC

簡(jiǎn)單來(lái)說(shuō),IOC反轉(zhuǎn)了依賴關(guān)系的滿足方式,由之前的自己創(chuàng)建依賴對(duì)象,變?yōu)橛晒S推送。(變主動(dòng)為被動(dòng),即反轉(zhuǎn))它解決了具有依賴關(guān)系的組件之間的強(qiáng)耦合,使得項(xiàng)目形態(tài)更加穩(wěn)健

二、什么是IOC?

2.1 了解IOC思想

大概了解了IOC是控制反轉(zhuǎn),至于現(xiàn)在我們并不清楚它的思想和作用。那么問題來(lái)了,IOC(控制反轉(zhuǎn))是什么呢?

控制反轉(zhuǎn),簡(jiǎn)稱IOC。顧名思義,它是由“控制”和“反轉(zhuǎn)”兩個(gè)詞語(yǔ)組合而成。那么我們就順藤摸瓜,分別分析一下這兩個(gè)詞語(yǔ)!

2.2 控制

控制一詞,我們需要想的就很多。比如說(shuō),達(dá)成控制的條件必須是兩個(gè)對(duì)象 ,控制可以分為誰(shuí)控制誰(shuí)控制你做什么 。那我們一一列舉這幾種情況:

  • 在Java中我們以new的方式創(chuàng)建對(duì)象,開發(fā)者控制控制著開發(fā)工具并間接的控制程序創(chuàng)建所需要的依賴對(duì)象,對(duì)于程序來(lái)說(shuō)是直接的控制創(chuàng)建對(duì)象;如果使用IOC呢?那就可以是IOC容器直接的控制創(chuàng)建對(duì)象
  • 既然是IOC控制創(chuàng)建對(duì)象,那么控制創(chuàng)建對(duì)象是怎么控制的呢?使用IOC創(chuàng)建對(duì)象是需要標(biāo)簽引入外部對(duì)象,這說(shuō)明了IOC容器控制著創(chuàng)建依賴對(duì)象的入口
  • 2.3 反轉(zhuǎn)

    反轉(zhuǎn)一詞,我們想的也很多。比如說(shuō),達(dá)成反轉(zhuǎn)的條件必須是兩個(gè)對(duì)象有反轉(zhuǎn)就有正轉(zhuǎn) ,然后就是反轉(zhuǎn)了些什么 。那么我們也一一列舉說(shuō)明:

  • 在Java中我們是間接的實(shí)用程序來(lái)創(chuàng)建對(duì)象,這可以看作正轉(zhuǎn)。那有了IOC容器,一下子就變了,我們不用自己new對(duì)象,而是直接反轉(zhuǎn)為由IOC創(chuàng)建生成依賴對(duì)象并存入IOC容器中
  • 使用IOC容器創(chuàng)建對(duì)象我們只需要通過(guò)配置來(lái)告訴它需要?jiǎng)?chuàng)建的對(duì)象是什么,并標(biāo)識(shí)一下以后使用什么來(lái)獲取IOC容器中創(chuàng)建好的對(duì)象即可(配置使用IOC的過(guò)程),這時(shí)候等你想要IOC容器中對(duì)象就直接用這個(gè)唯一標(biāo)識(shí)來(lái)獲取就好,而獲取的過(guò)程肯定是IOC通過(guò)這個(gè)唯一標(biāo)識(shí)來(lái)查找并返回給我們?cè)搶?duì)象
  • 也許有的小伙伴還是不明白反轉(zhuǎn)。為什么要把IOC容器幫我們創(chuàng)建對(duì)象的行為叫反轉(zhuǎn)呢?因?yàn)橛扇萜鲙臀覀儾檎壹白⑷胍蕾噷?duì)象,對(duì)象只是被動(dòng)的接受依賴對(duì)象。如果不反轉(zhuǎn)呢?開發(fā)者就需要?jiǎng)?chuàng)建對(duì)象,并找到、獲取、使用該對(duì)象,此過(guò)程中的所有都有開發(fā)者來(lái)控制的
  • 三、IOC的作用

    通過(guò)控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體將其所依賴的對(duì)象的引用傳遞給它。也可以說(shuō),依賴被注入到對(duì)象中。

    比如:Class A中用到了Class B的對(duì)象b,一般情況下,需要在A的代碼中顯式的new一個(gè)B的對(duì)象。

    在使用了IOC之后呢?A的代碼只需要定義一個(gè)私有的B對(duì)象,不需要直接new來(lái)獲得這個(gè)對(duì)象,而是通過(guò)相關(guān)的容器控制程序來(lái)將B對(duì)象在外部new出來(lái)并注入到A類里的引用中。而具體獲取的方法、對(duì)象被獲取時(shí)的狀態(tài)由配置文件(xml)來(lái)指定

    既然由配置文件來(lái)指定創(chuàng)建對(duì)象關(guān)系,就大大降低了各個(gè)組件之間的強(qiáng)耦合并有利于維護(hù),是項(xiàng)目變得更加穩(wěn)健靈活

    四、IOC解決Dao層和Service層的強(qiáng)耦合

    在原始的Web開發(fā)中,Dao層和Service層是密不可分的。Dao層為數(shù)據(jù)訪問層,只與數(shù)據(jù)庫(kù)打交道。Servcie層為業(yè)務(wù)處理層,只處理實(shí)現(xiàn)相應(yīng)的業(yè)務(wù)。而我們將Web開發(fā)中的Dao層和Service層串在一起,就需要在Service層new一個(gè)私有的Dao層實(shí)現(xiàn)對(duì)象(XxxDaoImpl)。有了IOC的思想,再想想傳統(tǒng)的Dao層與Service層的實(shí)現(xiàn)就顯得很不靈活,一旦修改了Dao層實(shí)現(xiàn)類,就必須將項(xiàng)目中的源碼都修改掉,顯然是一件非常可怕的事情。

    五、使用IOC解決Dao層和Service層的強(qiáng)耦合

    既然解決Dao層和Service層的強(qiáng)耦合那必須得這兩個(gè)組件對(duì)吧。

    Dao層

    //?Dao層接口package?com.mylifes1110.dao;import?com.mylifes1110.bean.User;public?interface?UserDao?{????int?insertUser(User?user);}//?Dao層實(shí)現(xiàn)類package?com.mylifes1110.dao.impl;import?com.mylifes1110.bean.User;import?com.mylifes1110.dao.UserDao;public?class?UserDaoImpl?implements?UserDao?{????@Override????public?int?insertUser(User?user)?{????????System.out.println("------insertUser?and?UserDao------");????????return?0;????}}

    注意: 我們?cè)谑褂肐OC時(shí),必須將Dao層實(shí)現(xiàn)類對(duì)象注入到IOC容器中,這必有一個(gè)注入方式來(lái)告知IOC容器創(chuàng)建對(duì)象和獲取對(duì)象,在Service層我們并不需要new實(shí)現(xiàn)類對(duì)象,而是創(chuàng)建一個(gè)Service層的Setter方法來(lái)注入U(xiǎn)serDaoImpl依賴到UserServcieImpl中(這里可以把它們想為拼裝),此時(shí)所用的注入方式叫做Setter方法依賴注入,現(xiàn)在不需要糾結(jié),后續(xù)我會(huì)將依賴注入的所有方式列舉并分析依賴注入思想和依賴注入與IOC的關(guān)系。

    Service層

    //?Service層接口package?com.mylifes1110.service;import?com.mylifes1110.bean.User;public?interface?UserService?{????int?insertUser(User?user);}//?Service層實(shí)現(xiàn)類package?com.mylifes1110.service.impl;import?com.mylifes1110.bean.User;import?com.mylifes1110.dao.UserDao;import?com.mylifes1110.service.UserService;public?class?UserServiceImpl?implements?UserService?{????private?UserDao?userDao;????public?void?setUserDao(UserDao?userDao)?{????????this.userDao?=?userDao;????}????@Override????public?int?insertUser(User?user)?{????????System.out.println("------insertUser?and?UserService------");????????return?userDao.insertUser(null);????}}

    spring-context.xml

    <?xml ?version="1.0"?encoding="UTF-8"?>????????????????????????????????????

    測(cè)試類

    /***?@MethodName?insertUser1*?@Param?[]*?@Description?測(cè)試IOC的使用*?@Author?Ziph*?@Date?2020/7/12*/@Testpublic?void?insertUser1()?{????ClassPathXmlApplicationContext?context?=?new?ClassPathXmlApplicationContext("spring-context.xml");????UserService?userService?=?(UserService)?context.getBean("UserService");????userService.insertUser(null);????//?打印結(jié)果????------insertUser?and?UserService------????------insertUser?and?UserDao------}

    分享

    上面是本人在學(xué)習(xí)路上整理的一些比較干貨的java資料,如果有需要的兄弟可以先關(guān)注我,私信我回復(fù)【資料】即可。

    總結(jié)

    以上是生活随笔為你收集整理的简述控制反转ioc_深度理解Spring IOC(控制反转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。