目錄
- 一、Bean 管理
- 1. 元資料
- 2. Bean 實體化
- 2.1 構造器實體化
- 2.2 靜態工廠方式實體化
- 2.3 實體工廠方式實體化
- 3. Bean 作用域
- 二、依賴注入
- 1. 依賴注入
- 1.1 構造器注入
- 1.2 Setter 方法注入
- 2. 依賴關系
- 3. 懶加載
- 4. 自動注入
- 1. 依賴注入
- 三、附錄
- 1. 配置屬性表
- 2. 示例代碼
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" />
<!--使用其他構造器-->
<bean id="beanExample" >
<constructor-arg index="0" value="https://www.cnblogs.com/code-artist/archive/2022/11/27/碼匠公眾號"/>
<constructor-arg index="1" value="https://www.cnblogs.com/code-artist/archive/2022/11/27/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" 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" factory-bean="beanExampleFactory" factory-method="getInstance"/>
<bean id="beanExampleFactory" />
3. Bean 作用域
通過 scope 屬性配置 bean 的作用域,來指定 bean 的實體化作用范圍,
<bean id="beanExample" scope="prototype"/>
常用的幾種 Bean 作用域如下:
| 作用域 | 描述 |
|---|---|
singleton |
(默認)單例作用域,在 Spring 容器內部只創建一個實體 |
prototype |
原型作用域,在容器中創建多個實體,每使用一次創建一個實體 |
request |
請求作用域,在 Web 框架下單次請求創建一個實體 |
session |
會話作用域,在 Web 框架下單次會話內創建一個實體 |
application |
應用作用域,在 ServletContext 生命周期內創建一個實體 |
二、依賴注入
Spring 容器創建好了 Bean 實體后,會根據實體間的依賴關系來進行注入,
1. 依賴注入
1.1 構造器注入
通過類的構造器來注入依賴的值或 Bean,
<bean id="beanExample" >
<constructor-arg index="0" value="https://www.cnblogs.com/code-artist/archive/2022/11/27/碼匠公眾號"/>
<constructor-arg index="1" value="https://www.cnblogs.com/code-artist/archive/2022/11/27/2021"/>
<constructor-arg index="2" ref="beanProvider"/>
</bean>
1.2 Setter 方法注入
通過類的 Setter 方法注入依賴的值或 Bean,
<bean id="beanExample" >
<property name="name" value="https://www.cnblogs.com/code-artist/archive/2022/11/27/碼匠公眾號"/>
<property name="year" value="https://www.cnblogs.com/code-artist/archive/2022/11/27/2021"/>
<property name="beanProvider" ref="beanProvider"/>
</bean>
在兩種注入方式中,配置值的方式:
value:注入值ref:注入參考(注入 Bean 實體)
2. 依賴關系
一般情況下,Bean 之間的依賴關系并不明確,但在一些情況下,比如初始化一個靜態類,使用 depends-on 屬性指定在初始化該 bean 之前,強制初始化依賴的一個或多個 bean,
<bean id="beanExample" depends-on="beanProvider" />
3. 懶加載
一般情況下,Spring 會在容器啟動的時候把所有 Bean 實體化完成,如果想在第一次使用的 Bean 的時候才初始化,可能配置 lazy-init 來實作,
<bean id="beanExample" lazy-init="true"/>
4. 自動注入
Spring 容器支持自動注入,而不需要手動通過 ref 來指定依賴的 bean 實體,
<bean id="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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538522.html
標籤:其他
上一篇:記一次博客園隨筆被爬經歷
下一篇:VH6501模板工程介紹(一)
