1. 程式人生 > 實用技巧 >2、IoC控制反轉(四聲)

2、IoC控制反轉(四聲)

學習資源:動力節點的2020最新Spring框架教程【IDEA版】-Spring框架從入門到精通

目錄


1、什麼是 IoC控制反轉

控制反轉(IoC, Inversion of Control),是一個概念,是一種思想。指將傳統上由程式程式碼直接操控的物件呼叫權交給容器,通過容器來實現物件的裝配和管理。控制反轉就是對物件控制權的轉移

,從程式程式碼本身反轉到了外部容器。 通過容器實現物件的建立,屬性賦值,依賴的管理。

當前比較流行的實現 IoC 的方式是依賴注入

依賴: classA 類中含有 classB 的例項,在 classA 中呼叫 classB 的方法完成功能,即 class A 對 class B 有依賴。

依賴注入:DI(Dependency Injection),程式程式碼不做定位查詢,這些工作由容器自行完成。

依賴注入 DI 是指程式執行過程中,若需要呼叫另一個物件協助時,無須在程式碼中建立被呼叫者,而是依賴於外部容器,由外部容器建立後傳遞給程式。Spring 的依賴注入對呼叫者與被呼叫者幾乎沒有任何要求,完全支援物件之間依賴關係的管理。

Spring 框架使用依賴注入(DI)實現 IoC。

Spring 容器是一個超級大工廠,負責建立、管理所有的 Java 物件,這些 Java 物件被稱為 Bean。 Spring 容器管理著容器中 Bean 之間的依賴關係, Spring 使用 DI 的方式來管理 Bean 之間的依賴關係,進而實現物件之間的解耦和。


2、DI 入門例項

2.1、建立 Maven 專案


2.2、引入 Maven 依賴

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.5.RELEASE</version>
</dependency>

<build>
<plugins>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>
</build>

2.3、定義介面與實體類

public interface SomeService {
    void doSome();
}
// 無屬性的實體類
public class SomeServiceImpl implements SomeService {
    
    public SomeServiceImpl() {
        super();
        System.out.println("SomeServiceImpl無引數構造方法");
    }
    @Override
    public void doSome() {
        System.out.println("====業務方法doSome()===");
    }
}

2.4、建立 Spring 配置檔案

在 src/main/resources/ 目錄下建立一個 xml 檔案,applicationContext.xml

檔案初始內容:

  • <\beans> 是 Spring 配置檔案的根標籤
  • spring-beans.xsd 是約束檔案
<?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.xsd">

</beans>

2.5、註冊 bean物件

<\bean> 標籤用於在 Spring 容器中宣告註冊一個實體類的物件。

標籤屬性:

  • id:該屬性是 Bean 例項的唯一標識,自定義名稱,程式通過 id 屬性訪問 Bean, Bean 與 Bean 間的依賴關係也是通過 id 屬性關聯的。
  • class:指定該 Bean 所屬的類,使用類的全限定名稱。
    注意:Spring 底層是由反射機制建立物件,所以必須使用實體類,不能是介面。
<?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.xsd">

    <bean id="someService" class="com.bjpoewernode.service.impl.SomeServiceImpl" />
    
    <!-- 其他Bean -->
    <bean id="xxx" class="xxx.xxx.xxx" />
    ......
</beans>

Spring 完成 SomeService someService = new SomeServiceImpl(); 的建立,並建立好的物件放入到一個框架內部的 map 中,springMap.put(beanId, 例項物件); ,例如:springMap.put("someService", newSomeServiceImpl());


2.6、測試

2.6.1、獲取 Spring 容器中的物件

  1. 指定 Spring 配置檔案的位置和名稱,applicationContext.xml 通常都放置在 resources 目錄下
  2. 建立 Spring 容器的物件,ApplicationContext物件,
    (qaq,怎麼還是需要 new 啊