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 容器中的物件
- 指定 Spring 配置檔案的位置和名稱,applicationContext.xml 通常都放置在 resources 目錄下
- 建立 Spring 容器的物件,
ApplicationContext
物件,
(qaq,怎麼還是需要 new 啊