文章已託管到GitHub,你們能夠去GitHub查看閱讀,歡迎老闆們前來Star! 搜索關注微信公衆號 碼出Offer 領取各類學習資料!java
Inverse Of Controll即爲控制反轉,簡稱IOC 。git
簡單來講,IOC反轉了依賴關係的知足方式,由以前的本身建立依賴對象,變爲由工廠推送。(變主動爲被動,即反轉)它解決了具備依賴關係的組件之間的強耦合,使得項目形態更加穩健github
大概瞭解了IOC是控制反轉,至於如今咱們並不清楚它的思想和做用。那麼問題來了,IOC(控制反轉)是什麼呢?spring
控制反轉,簡稱IOC。顧名思義,它是由「控制」和「反轉」兩個詞語組合而成。那麼咱們就順藤摸瓜,分別分析一下這兩個詞語!數據庫
控制一詞,咱們須要想的就不少。好比說,達成控制的條件必須是兩個對象 ,控制能夠分爲誰控制誰 ,控制你作什麼 。那咱們一一列舉這幾種狀況:微信
反轉一詞,咱們想的也不少。好比說,達成反轉的條件必須是兩個對象 ,有反轉就有正轉 ,而後就是反轉了些什麼 。那麼咱們也一一列舉說明:ide
經過控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體將其所依賴的對象的引用傳遞給它。也能夠說,依賴被注入到對象中。工具
好比:Class A中用到了Class B的對象b,通常狀況下,須要在A的代碼中顯式的new一個B的對象。學習
在使用了IOC以後呢?A的代碼只須要定義一個私有的B對象,不須要直接new來得到這個對象,而是經過相關的容器控制程序來將B對象在外部new出來並注入到A類裏的引用中。而具體獲取的方法、對象被獲取時的狀態由配置文件(xml)來指定開發工具
既然由配置文件來指定建立對象關係,就大大下降了各個組件之間的強耦合並有利於維護,是項目變得更加穩健靈活
在原始的Web開發中,Dao層和Service層是密不可分的。Dao層爲數據訪問層,只與數據庫打交道。Servcie層爲業務處理層,只處理實現相應的業務。而咱們將Web開發中的Dao層和Service層串在一塊兒,就須要在Service層new一個私有的Dao層實現對象(XxxDaoImpl)。有了IOC的思想,再想一想傳統的Dao層與Service層的實現就顯得很不靈活,一旦修改了Dao層實現類,就必須將項目中的源碼都修改掉,顯然是一件很是可怕的事情。
既然解決Dao層和Service層的強耦合那必須得這兩個組件對吧。
Dao層
// Dao層接口
package com.mylifes1110.dao;
import com.mylifes1110.bean.User;
public interface UserDao {
int insertUser(User user);
}
// Dao層實現類
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;
}
}
複製代碼
注意: 咱們在使用IOC時,必須將Dao層實現類對象注入到IOC容器中,這必有一個注入方式來告知IOC容器建立對象和獲取對象,在Service層咱們並不須要new實現類對象,而是建立一個Service層的Setter方法來注入UserDaoImpl依賴到UserServcieImpl中(這裏能夠把它們想爲拼裝),此時所用的注入方式叫作Setter方法依賴注入,如今不須要糾結,後續我會將依賴注入的全部方式列舉並分析依賴注入思想和依賴注入與IOC的關係。
Service層
// Service層接口
package com.mylifes1110.service;
import com.mylifes1110.bean.User;
public interface UserService {
int insertUser(User user);
}
// Service層實現類
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"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/beans/spring-context.xsd">
<!--id:惟一標識 class:須要被建立的目標對象全限定名-->
<bean id="UserDao" class="com.mylifes1110.dao.impl.UserDaoImpl"/>
<!--id:惟一標識 class:須要被建立的目標對象全限定名-->
<bean id="UserService" class="com.mylifes1110.service.impl.UserServiceImpl">
<!--Setter方法依賴注入 name:Service層定義的userDao屬性 ref:Dao層bean標籤惟一標識-->
<property name="userDao" ref="UserDao"/>
</bean>
</beans>
複製代碼
測試類
/** * @MethodName insertUser1 * @Param [] * @Description 測試IOC的使用 * @Author Ziph * @Date 2020/7/12 */
@Test
public void insertUser1() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
UserService userService = (UserService) context.getBean("UserService");
userService.insertUser(null);
// 打印結果
------insertUser and UserService------
------insertUser and UserDao------
}
複製代碼