Spring 的核心功能就是提供一個 IoC 容器,用於管理應用程式中的 bean,在容器中配置元數據來管理 Bean 之間的依賴關係,Java 程式中的類都可以交由 Spring 容器管理。 ...
目錄
Spring 的核心功能就是提供一個 IoC 容器,用於管理應用程式中的 bean,在容器中配置元數據來管理 Bean 之間的依賴關係,Java 程式中的類都可以交由 Spring 容器管理。
一、Bean 管理
1. 元數據
配置 Spring 元數據的方式有三種:
- 基於 XML 方式配置
- 基於註解方式配置
- 基於 Java 方式配置
Spring 最早的時候提供BeanFactory
介面實現 Bean 容器,而後面新增的許多功能都是基於其子介面ApplicationContext
來實現的,前面說的三種配置方式,可以使用下麵三個實現類來實例化容器。
|interface BeanFactory (org.springframework.beans.factory)
|---interface ApplicationContext (org.springframework.context)
|---|---class FileSystemXmlApplicationContext (org.springframework.context.support)
|---|---class ClassPathXmlApplicationContext (org.springframework.context.support)
|---|---class AnnotationConfigApplicationContext (org.springframework.context.annotation)
例如使用 ClassPathXmlApplicationContext
來通過 classpath
目錄下的配置文件實例化容器:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
2. Bean 實例化
在 Spring 容器中配置好的 Bean 都會被 Spring 自動實例化,以供在開發過程中註入直接可以使用,而不需要手動去 new
對象。
2.1 構造器實例化
Spring 容器預設使用類的無參構造器來實例化 Bean,也可以指定其他帶參數的構造器來實例化。
<!--預設使用無參構造器-->
<bean id="beanProvider" class="cn.codeartist.spring.bean.xml.BeanProvider"/>
<!--使用其他構造器-->
<bean id="beanExample" class="cn.codeartist.spring.bean.xml.BeanExample">
<constructor-arg index="0" value="碼匠公眾號"/>
<constructor-arg index="1" value="2021"/>
<constructor-arg index="2" ref="beanProvider"/>
</bean>
2.2 靜態工廠方式實例化
Spring 容器支持使用靜態工廠方法來實例化 Bean,在類中定義一個 static
方法來創建對象實例。
public class BeanExample {
private static BeanExample beanExample = new BeanExample();
public static BeanExample getInstance() {
return beanExample;
}
}
在 Bean 配置中使用 factory-method
屬性來指定工廠方法。
<bean id="beanExample" class="...xml.BeanExample" factory-method="getInstance"/>
2.3 實例工廠方式實例化
和靜態工廠方法一樣,不同的是工廠方法是實例化後的 Bean 的方法而不是靜態方法。
public class BeanExampleFactory {
private static BeanExample beanExample = new BeanExample();
public BeanExample getInstance() {
return beanExample;
}
}
在 Bean 配置中使用 factory-bean
屬性指定工廠類的 Bean,使用 factory-method
屬性來指定工廠方法。
<bean id="beanExample" class="...xml.BeanExample" factory-bean="beanExampleFactory" factory-method="getInstance"/>
<bean id="beanExampleFactory" class="cn.codeartist.spring.bean.xml.BeanExampleFactory"/>
3. Bean 作用域
通過 scope
屬性配置 bean 的作用域,來指定 bean 的實例化作用範圍。
<bean id="beanExample" class="...xml.BeanExample" scope="prototype"/>
常用的幾種 Bean 作用域如下:
作用域 | 描述 |
---|---|
singleton |
(預設)單例作用域,在 Spring 容器內部只創建一個實例 |
prototype |
原型作用域,在容器中創建多個實例,每使用一次創建一個實例 |
request |
請求作用域,在 Web 框架下單次請求創建一個實例 |
session |
會話作用域,在 Web 框架下單次會話內創建一個實例 |
application |
應用作用域,在 ServletContext 生命周期內創建一個實例 |
二、依賴註入
Spring 容器創建好了 Bean 實例後,會根據實例間的依賴關係來進行註入。
1. 依賴註入
1.1 構造器註入
通過類的構造器來註入依賴的值或 Bean。
<bean id="beanExample" class="...xml.BeanExample">
<constructor-arg index="0" value="碼匠公眾號"/>
<constructor-arg index="1" value="2021"/>
<constructor-arg index="2" ref="beanProvider"/>
</bean>
1.2 Setter 方法註入
通過類的 Setter 方法註入依賴的值或 Bean。
<bean id="beanExample" class="...xml.BeanExample">
<property name="name" value="碼匠公眾號"/>
<property name="year" value="2021"/>
<property name="beanProvider" ref="beanProvider"/>
</bean>
在兩種註入方式中,配置值的方式:
value
:註入值ref
:註入引用(註入 Bean 實例)
2. 依賴關係
一般情況下,Bean 之間的依賴關係並不明確,但在一些情況下,比如初始化一個靜態類,使用 depends-on
屬性指定在初始化該 bean 之前,強制初始化依賴的一個或多個 bean。
<bean id="beanExample" class="...xml.BeanExample" depends-on="beanProvider" />
3. 懶載入
一般情況下,Spring 會在容器啟動的時候把所有 Bean 實例化完成,如果想在第一次使用的 Bean 的時候才初始化,可能配置 lazy-init
來實現。
<bean id="beanExample" class="...xml.BeanExample" lazy-init="true"/>
4. 自動註入
Spring 容器支持自動註入,而不需要手動通過 ref
來指定依賴的 bean 實例。
<bean id="beanExample" class="...xml.BeanExample" autowire="byName"/>
容器支持的註入方式:
註入方式 | 描述 |
---|---|
no |
(預設)不使用自動註入 |
byName |
通過 bean 名稱註入 |
byType |
通過 bean 類型註入 |
constructor |
通過構造器參數類型註入 |
三、附錄
1. 配置屬性表
屬性 | 預設值 | 描述 |
---|---|---|
id |
- | 指定 bean 的名稱 |
class |
- | 指定 bean 的類 |
scope |
singleton |
指定作用域 |
depends-on |
- | 指定依賴關係 |
lazy-init |
false |
配置懶載入 |
autowire |
no |
配置自動註入 |
factory-bean |
- | 指定提供工廠方法的 bean |
factory-method |
- | 指定創建 bean 的工廠方法 |
2. 示例代碼
Gitee 倉庫:https://gitee.com/code_artist/spring
代碼目錄:src/main/java/cn/codeartist/spring/bean/xml
本文來自博客園,作者:碼匠_CodeArtist,轉載請註明原文鏈接:https://www.cnblogs.com/code-artist/p/spring-2.html