javascript
简述控制反转ioc_深度理解Spring IOC(控制反转)
一、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í) ,控制你做什么 。那我們一一列舉這幾種情況:
2.3 反轉(zhuǎn)
反轉(zhuǎn)一詞,我們想的也很多。比如說(shuō),達(dá)成反轉(zhuǎn)的條件必須是兩個(gè)對(duì)象 ,有反轉(zhuǎn)就有正轉(zhuǎn) ,然后就是反轉(zhuǎn)了些什么 。那么我們也一一列舉說(shuō)明:
三、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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android两个java文件内容_ja
- 下一篇: gradle idea java ssm