IoC 容器
文章目錄
- IoC 容器
-
- 1 IoC 概念
- 2 底層原理概述
- 3 IoC 接口
- 4 ApplicationContext 接口的實作類
-
- 4.1 ClassPathXmlApplicationContext 實作類
- 4.2 FileSystemXmlApplicationContext 實作類
- 4.3 AnnotationConfigApplicationContext 實作類
1 IoC 概念
Spring 官方解釋:https://docs.spring.io/spring/docs/5.2.8.RELEASE/spring-framework-reference/core.html#spring-core
IoC 也稱為依賴注入(DI)。在此過程中,對象僅通過構造函數參數,工廠方法的參數或在構造或者從工廠方法傳回後再對象設定的屬性來定義其依賴項(也就是說,它們使用的其他對象)。然後,容器在建立 bean 時注入這些依賴項。這個過程從根本上反轉了 bean 控制自身執行個體化或通過有參構造來定位其依賴屬性(如伺服器定位機制)的過程。
英文水準有限,可能有翻譯不對的地方,也可以去看看百度百科怎麼說的:百度百科
就我的了解:控制反轉(Inversion of Control,IoC),就是将 bean 執行個體化的過程交給了 Spring 來管理,并不是随用随 new ,從一定程度上降低了程式間的硬耦合。
2 底層原理概述
IoC 容器本質類似于一個 Map 集合,實作過程中使用了反射和工廠模式。大緻實作過程如下:
1 首先有一個 Bean 類(Bean 在計算機中指的是可重複利用的元件,不僅限于實體類)
public class User {
private String name;
public User() {}
public User(String name) {this.name = name;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
2 在 xml 配置檔案中,配置要建立的 bean 對象。
<!-- 預設使用無參構造 -->
<bean id="user" class="com.jc.spring5.User"></bean>
3 建立工廠類中通過 xml 解析 和反射來建立對象。
class UserFactory{
public static User getUser(){
String classValue = class屬性; // 1 通過 xml 解析得到 bean 的屬性。
Class cls = Class.forName(classValue); // 2 通過反射得到位元組碼檔案
return (User)cls.newInstance(); // 3 建立對象
}
}
4 加載配置檔案,擷取建立的對象。
//1 加載 spring 配置檔案
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
//2 擷取配置建立的對象
User user = context.getBean("user", User.class);
System.out.println(user); //由于沒有設值,我重寫了 bean 的 toString 方法,列印結果為:User{name='null'}
3 IoC 接口
類視圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL0cDO3QjM1MjM0ADOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
-
和org.springframework.beans
兩個包是 IoC 容器的基礎,Ioc 容器的底層就是對象工廠。org.springframework.context
- Spring 提供了 IoC 容器實作的兩種方式(兩種接口):
和BeanFactory
ApplicationContext
-
接口提供了一種進階配置機制,能夠管理任何類型的對象。特點是:加載配置檔案的時候,不會建立對象,在調用 getBean() 方法時才會去建立對象,是一種懶加載的方式。BeanFactory
-
接口 是ApplicationContext
接口的子接口,這個接口代表Spring IoC容器,并負責執行個體化,配置群組裝Bean。在BeanFactory
的基礎上增加了:BeanFactory
- 更加容易內建 Spring 的 AOP 功能
- 消息資源處理(用于國際化)
- 事件釋出
-
應用層特定的上下文,例如WebApplicationContext 用于Web應用程式中的。
特點是:加載配置檔案的時候,就會建立配置中的對象。
總而言之,
BeanFactory
提供配置架構和基本功能。
ApplicationContext
提供了更多企業級的功能。開發中更常用的是
ApplicationContext
接口,這樣做可以将耗時耗資源的操作都交給伺服器處理,在伺服器啟動時就完成這些操作,而不是說什麼時候用什麼時候建立。 Spring 官網對
ApplicationContext
的描述更多,把
BeanFactory
的描述作為了解項。
對 Bean 的補充:
在 Spring 中,構成應用程式主幹并由 Spring IoC 容器管理的對象稱為 bean。bean 是由 Spring IoC 容器執行個體化、組裝和管理的對象。另外,bean 隻是應用程式中許多對象中的一個。bean及其之間的依賴關系反映在容器使用的配置中繼資料中。通俗來講, Bean 就是一個可重複利用的 Java 類。
4 ApplicationContext 接口的實作類
- Spring 中提供了
的幾種實作類。ApplicationContext
- 在獨立應用程式中,通常使用
或ClassPathXmlApplicationContext
建立執行個體。FileSystemXmlApplicationContext
- 這兩個實作類是用于加載 xml 配置檔案的。
- 基于注解的開發方式,使用的是:
實作類,AnnotationConfigApplicationContext
- 這個實作類是用于加載 配置類 的位元組碼檔案的。
4.1 ClassPathXmlApplicationContext 實作類
這是最常用的實作類,使用方式如下:
-
是用來加載類路徑中的 xml 配置檔案,參數是一個可變長參數,可以加載多個 xml 配置檔案。ClassPathXmlApplicationContext
4.2 FileSystemXmlApplicationContext 實作類
用于加載絕對路徑下的 xml 配置檔案,使用方式如下:
ApplicationContext context =
new FileSystemXmlApplicationContext("H:\\Java\\01_Study\\01_Spring\\02_依賴注入_基于xml\\src\\bean.xml");
這個實作類也可以用來加載類路徑中的 xml 配置檔案,需要加上
classpath:
字首表達式
關于
ClassPathXmlApplicationContext
和
FileSystemXmlApplicationContext
的差別:
- 前者預設就是指項目的
路徑,可以省略classpath
字首,加上classpath:
字首後表示絕對路徑。file:
- 後者預設有兩種表示:沒有盤符的是 項目工作路徑,即項目的根目錄;有盤符表示的是檔案絕對路徑,可省略
字首。如果要使用file:
路徑,需要加上classpath
字首。classpath:
- 常用的實作類是:
。ClassPathXmlApplicationContext
- 關于兩個實作類的差別,可以參考以下部落格:
- Spring中ClassPathXmlApplication與FileSystemXmlApplicationContext的差別
- Spring中ClassPathXmlApplicationContext類的使用,以及與FileSystemXmlApplicationContext的差別
- java項目裡classpath具體指哪兒個路徑
4.3 AnnotationConfigApplicationContext 實作類
這個實作類使用來加載注解配置類的位元組碼檔案,使用方式如下:
@Configuration
@ComponentScan(basePackages= {"com.jk")
public class SpringConfig(){
}
ApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
這裡隻是介紹了 IoC 容器的基本概念,具體實作方式有 2 種:基于 xml 配置檔案的依賴注入(DI)和基于注解的依賴注入(DI),在其他篇幅中:
Spring IoC 的依賴注入 - 基于 xml 方式
Spring IoC 的依賴注入 - 基于注解注入