1. IOC的基礎知識背景:
IoC理論的背景:在采用面向對象方法設計的軟體系統中,底層實作都是由N個對象組成的,所有的對象通過彼此的合作,最終實作系統的業務邏輯。
這樣對象和對象之間有着複雜的依賴關系,是以才有了控制反轉這個理論。
2. 什麼是IOC
IoC是Inversion of Control的縮寫,翻譯成“控制反轉”,即控制不再有對象之間互相調用進行,而是有IOC容器進行,子產品隻需要做好自己就行。
如圖:
3. 為什麼要把這種方式叫做控制反轉
對象之間互相依賴,調用時候控制權在我們手上,我們使用時候一個一個new,A—>B,B —>C,…(A調用B,B調用C,多起來了,你不就懵逼了麼),如圖:
小朋友,您是否有很多問号???
于是乎,如果軟體系統引入了Ioc容器之後,對象之間失去了直接聯系,IoC容器會主動建立一個對象B注入到對象A所需要的地方,擷取對象由主動行為變成了被動行為,即把建立對象交給了IoC容器處理,控制權颠倒過來了,這就是控制反轉的由來。
另外,
IoC的别名:依賴注入(DI)
: 即實作IOC的方法就是注入,由IoC容器在運作期間,動态地将某種依賴關系注入到對象之中。
4. IoC的原理
控制反轉是spring架構的核心,也就是說,所有的元件都是被動的,所有的元件初始化和調用都由容器負責。元件處在一個容器當中,由容器負責管理。簡單的來講,就是由容器控制程式之間的關系,而非傳統實作中,由程式代碼直接操控,即在一個類中調用另外一個類。這也就是所謂“控制反轉”的概念所在:控制權由應用代碼中轉到了外部容器,控制權的轉移,即所謂反轉。
5. Spring IoC中經常用到一個設計模式,即工廠模式
工廠模式是指:當應用程式中甲元件需要乙元件協助時,并不是在甲元件中直接執行個體化乙元件對象,而是通過乙元件的工廠擷取,即該工廠可以生成某一類型元件的執行個體對象。在這種模式下,甲元件無需與乙元件以寫死的方式耦合在一起,而隻需與乙元件的工廠耦合,這樣,解除了Bean之間的依賴關系。
大朋友,開始撸一下代碼!
1. 建立一個接口
/**
* 建立一個電子産品接口,包含兩個方法,一個準備裝置,一個連結裝置
*/
public interface Electronic {
public abstract void prepareDevice();
public abstract void connectDevice();
}
2. 建立兩個Bean,一個電腦類,一個滑鼠類
public class Computer implements Electronic {
@Override
public void prepareDevice() {
System.out.println("電腦準備好了");
}
@Override
public void connectDevice() {
System.out.println("電腦等待連接配接");
}
}
public class Mouse implements Electronic {
@Override
public void prepareDevice() {
System.out.println("滑鼠準備好了");
}
@Override
public void connectDevice() {
System.out.println("滑鼠連接配接電腦");
}
}
3. 建立一個工廠
public class Factory {
public Electronic getElectronic(String electronicName) throws Exception {
if (electronicName.equals("computer")){
return new Computer();
}else if (electronicName.equals("mouse")){
return new Mouse();
}else {
throw new IllegalArgumentException("讓工廠生産的裝置不存在,瞎雞兒輸入");
}
}
}
4. 測試方法
public class testFactory {
public static void main(String[] args) throws Exception {
// 先建立一個接口,預設為空
Electronic electronic = null;
// 進行工廠生産Computer, 注意轉型
electronic = (Electronic) new Factory().getElectronic("computer");
// 對工廠的産品操作
electronic.prepareDevice();
electronic.connectDevice();
// 進行工廠生産Mouse, 注意轉型
electronic = (Electronic) new Factory().getElectronic("mouse");
// 對工廠的産品操作
electronic.prepareDevice();
electronic.connectDevice();
}
}
結果如圖:
6. 再回頭看看我們spring中怎麼使用
1. 建立一個person類
public class Person {
public void say(String str) {
System.out.println(str);
}
}
2. 配置xml檔案
<?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/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="person" class="com.test.spring.Person"></bean>
</beans>
package com.test.spring;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Person_Test {
@Test
/**
* SpringIOC擷取對象
* <bean id="person" class="com.test.spring.person">
*/
public void test01() {
//建立Spring容器對象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//通過我們配置檔案中面配置的beanid來擷取對象:id="person"
// 這兒其實就是用到了工廠,通過context工廠,用getBean方法,傳入參數,得到建立的對象,同時轉型
Person p = (Person)context.getBean("person");
//調用對象的方法,并傳人參數
p.say("Hello SpringIOC");
p.say("Spring控制反轉");
}
}