文章已托管到GitHub,大家可以去GitHub查看閱讀,歡迎老板們前來Star! 搜索關注微信公眾號 碼出Offer 領取各種學習資料!

深度理解Spring IOC(控制反轉)
一、IOC概述
Inverse Of Controll即為控制反轉,簡稱IOC ,
簡單來說,IOC反轉了依賴關系的滿足方式,由之前的自己創建依賴物件,變為由工廠推送,(變主動為被動,即反轉)它解決了具有依賴關系的組件之間的強耦合,使得專案形態更加穩健
二、什么是IOC?
2.1 了解IOC思想
大概了解了IOC是控制反轉,至于現在我們并不清楚它的思想和作用,那么問題來了,IOC(控制反轉)是什么呢?
控制反轉,簡稱IOC,顧名思義,它是由“控制”和“反轉”兩個詞語組合而成,那么我們就順藤摸瓜,分別分析一下這兩個詞語!
2.2 控制
控制一詞,我們需要想的就很多,比如說,達成控制的條件必須是兩個物件 ,控制可以分為誰控制誰 ,控制你做什么 ,那我們一一列舉這幾種情況:
- 在Java中我們以new的方式創建物件,開發者控制控制著開發工具并間接的控制程式創建所需要的依賴物件,對于程式來說是直接的控制創建物件;如果使用IOC呢?那就可以是IOC容器直接的控制創建物件
- 既然是IOC控制創建物件,那么控制創建物件是怎么控制的呢?使用IOC創建物件是需要標簽引入外部物件,這說明了IOC容器控制著創建依賴物件的入口
2.3 反轉
反轉一詞,我們想的也很多,比如說,達成反轉的條件必須是兩個物件 ,有反轉就有正轉 ,然后就是反轉了些什么 ,那么我們也一一列舉說明:
- 在Java中我們是間接的實用程式來創建物件,這可以看作正轉,那有了IOC容器,一下子就變了,我們不用自己new物件,而是直接反轉為由IOC創建生成依賴物件并存入IOC容器中
- 使用IOC容器創建物件我們只需要通過配置來告訴它需要創建的物件是什么,并標識一下以后使用什么來獲取IOC容器中創建好的物件即可(配置使用IOC的程序),這時候等你想要IOC容器中物件就直接用這個唯一標識來獲取就好,而獲取的程序肯定是IOC通過這個唯一標識來查找并回傳給我們該物件
- 也許有的小伙伴還是不明白反轉,為什么要把IOC容器幫我們創建物件的行為叫反轉呢?因為由容器幫我們查找及注入依賴物件,物件只是被動的接受依賴物件,如果不反轉呢?開發者就需要創建物件,并找到、獲取、使用該物件,此程序中的所有都有開發者來控制的
三、IOC的作用
通過控制反轉,物件在被創建的時候,由一個調控系統內所有物件的外界物體將其所依賴的物件的參考傳遞給它,也可以說,依賴被注入到物件中,
比如:Class A中用到了Class B的物件b,一般情況下,需要在A的代碼中顯式的new一個B的物件,
在使用了IOC之后呢?A的代碼只需要定義一個私有的B物件,不需要直接new來獲得這個物件,而是通過相關的容器控制程式來將B物件在外部new出來并注入到A類里的參考中,而具體獲取的方法、物件被獲取時的狀態由組態檔(xml)來指定
既然由組態檔來指定創建物件關系,就大大降低了各個組件之間的強耦合并有利于維護,是專案變得更加穩健靈活
四、IOC解決Dao層和Service層的強耦合
在原始的Web開發中,Dao層和Service層是密不可分的,Dao層為資料訪問層,只與資料庫打交道,Servcie層為業務處理層,只處理實作相應的業務,而我們將Web開發中的Dao層和Service層串在一起,就需要在Service層new一個私有的Dao層實作物件(XxxDaoImpl),有了IOC的思想,再想想傳統的Dao層與Service層的實作就顯得很不靈活,一旦修改了Dao層實作類,就必須將專案中的原始碼都修改掉,顯然是一件非常可怕的事情,
五、使用IOC解決Dao層和Service層的強耦合
既然解決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------
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/144546.html
標籤:Java
上一篇:大牛聊Java并發編程原理之 執行緒的互斥與協作機制
下一篇:BCB編譯成功后把exe檔案裝到別的電腦上,提示”由于找不到vcl60.bpl,無法繼續執行。。。。。“,怎么解決
