天天看點

JAVA之IOC控制原理

1. IOC的基礎知識背景:

IoC理論的背景:在采用面向對象方法設計的軟體系統中,底層實作都是由N個對象組成的,所有的對象通過彼此的合作,最終實作系統的業務邏輯。​

​這樣對象和對象之間有着複雜的依賴關系,是以才有了控制反轉這個理論。​

2. 什麼是IOC

IoC是Inversion of Control的縮寫,翻譯成“控制反轉”,即控制不再有對象之間互相調用進行,而是有IOC容器進行,子產品隻需要做好自己就行。

如圖:

JAVA之IOC控制原理
JAVA之IOC控制原理

3. 為什麼要把這種方式叫做控制反轉

對象之間互相依賴,調用時候控制權在我們手上,我們使用時候一個一個new,A—>B,B —>C,…(A調用B,B調用C,多起來了,你不就懵逼了麼),如圖:

JAVA之IOC控制原理

小朋友,您是否有很多問号???

JAVA之IOC控制原理

于是乎,如果軟體系統引入了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();
    }
}      

結果如圖:

JAVA之IOC控制原理

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控制反轉");
    }
}      

7.小朋友,你的問号應該沒了吧!