Spring實例化bean的方式大全
Spring 實例化 Bean 主要有三種核心方式:構造器實例化、靜態(tài)工廠方法實例化和實例工廠方法實例化,其中構造器實例化是最常用的方式。
1. 構造器實例化(默認方式)
Spring 容器通過調(diào)用 Bean 類的構造器(默認無參構造器或有參構造器)來創(chuàng)建實例,這是最基礎、最常用的方式。
無參構造器實例化:Bean 類必須提供無參構造器(若未顯式定義任何構造器,Java 會默認生成)。
<!-- 配置文件方式 -->
<bean id="userService" class="com.example.UserService"/>
// 注解方式(@Component、@Service等)
@Service
public class UserService {
// 無參構造器(默認存在)
}
有參構造器實例化:需在配置中指定構造器參數(shù),Spring 會根據(jù)參數(shù)類型、索引或名稱匹配對應的構造器。
<bean id="user" class="com.example.User">
<constructor-arg name="id" value="1"/>
<constructor-arg name="name" value="Alice"/>
</bean>
2. 靜態(tài)工廠方法實例化
通過調(diào)用一個靜態(tài)工廠類的靜態(tài)方法來創(chuàng)建 Bean 實例,適用于實例創(chuàng)建邏輯復雜,需封裝在工廠中的場景。
1.定義靜態(tài)工廠類和靜態(tài)方法。
public class UserStaticFactory {
// 靜態(tài)工廠方法
public static User createUser() {
return new User(2, "Bob");
}
}
2.在配置中指定工廠類和靜態(tài)方法。
<bean id="userByStaticFactory"
class="com.example.UserStaticFactory"
factory-method="createUser"/>
3. 實例工廠方法實例化
通過調(diào)用一個非靜態(tài)工廠類的實例方法來創(chuàng)建 Bean 實例,工廠類本身也需要作為一個 Bean 被 Spring 管理。
1.定義實例工廠類和實例方法。
public class UserInstanceFactory {
// 實例工廠方法(非靜態(tài))
public User createUser() {
return new User(3, "Charlie");
}
}
2.先配置工廠 Bean,再配置目標 Bean,指定工廠 Bean 和實例方法。
<!-- 配置實例工廠Bean -->
<bean id="userInstanceFactory" class="com.example.UserInstanceFactory"/>
<!-- 通過工廠Bean的實例方法創(chuàng)建目標Bean -->
<bean id="userByInstanceFactory"
factory-bean="userInstanceFactory"
factory-method="createUser"/>
4.factoryBean
FactoryBean 是 Spring 提供的一種特殊 Bean,它本身不直接作為業(yè)務對象,而是專門用于創(chuàng)建和管理其他 Bean 實例的“工廠”。與普通實例工廠方法不同,F(xiàn)actoryBean 是 Spring 容器級別的擴展點,使用更靈活。
核心原理
當 Spring 容器發(fā)現(xiàn)一個 Bean 的類型是 FactoryBean 時,它不會直接返回該 Bean 本身,而是會調(diào)用其 getObject() 方法,并將該方法的返回值作為最終的 Bean 實例返回給使用者。
實現(xiàn)步驟
實現(xiàn) FactoryBean 接口來實例化 Bean,通常分為以下3步:
1.實現(xiàn) FactoryBean 接口
自定義一個類實現(xiàn) org.springframework.beans.factory.FactoryBean 接口,并實現(xiàn)其3個核心方法。
import org.springframework.beans.factory.FactoryBean;
// T 為要創(chuàng)建的目標 Bean 類型
public class UserFactoryBean implements FactoryBean<User> {
/**
* 核心方法:返回目標 Bean 的實例
* 復雜的創(chuàng)建邏輯(如依賴注入、初始化配置)可在此實現(xiàn)
*/
@Override
public User getObject() throws Exception {
User user = new User();
user.setId(4);
user.setName("David");
// 模擬復雜邏輯:如調(diào)用其他服務、讀取配置等
return user;
}
/**
* 返回目標 Bean 的類型
*/
@Override
public Class<?> getObjectType() {
return User.class;
}
/**
* 指定目標 Bean 是否為單例(默認 true)
*/
@Override
public boolean isSingleton() {
return true;
}
}
2.配置 FactoryBean 到 Spring 容器
將自定義的 FactoryBean 本身作為一個普通 Bean 配置到 Spring 中(XML 或注解方式均可)。
<!-- XML 配置方式 -->
<bean id="userFactoryBean" class="com.example.UserFactoryBean"/>
// 注解配置方式(@Component)
@Component("userFactoryBean")
public class UserFactoryBean implements FactoryBean<User> {
// 實現(xiàn)同上
}
3.獲取目標 Bean
從 Spring 容器中獲取的并非 UserFactoryBean 實例,而是其 getObject() 方法返回的 User 實例。
@Test
public void test6() {
// 測試類
//通過注解的方式生成bean的測試
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
User user = (User) context.getBean("myFactoryBean");
System.out.println(user);
//獲取工廠本身
UserFactoryBean userFactoryBean = (UserFactoryBean) context.getBean("&myFactoryBean");
System.out.println(userFactoryBean);
}
關鍵特點
- 隱藏創(chuàng)建細節(jié):將目標 Bean 復雜的創(chuàng)建邏輯(如依賴組裝、多步驟初始化)封裝在 FactoryBean 中,使用者無需關心。
- 容器集成度高:FactoryBean 本身受 Spring 容器管理,可以注入其他 Bean、感知容器生命周期(如實現(xiàn) InitializingBean)。
- 單例/多例控制:通過 isSingleton() 方法可靈活控制目標 Bean 是單例(默認)還是多例。
典型應用場景
- 整合第三方框架:如 MyBatis 中的 SqlSessionFactoryBean,Spring 整合 Redis 時的 RedisTemplate 工廠等。
- 創(chuàng)建復雜實例:當一個 Bean 的創(chuàng)建需要大量配置(如讀取配置文件、調(diào)用多個服務)時,使用 FactoryBean 封裝邏輯。
總結
| 實例化方式 | 核心特點 | 適用場景 |
|---|---|---|
| 構造器實例化 | 簡單直接,Spring 默認方式 | 大多數(shù)普通 Bean,無復雜創(chuàng)建邏輯 |
| 靜態(tài)工廠實例化 | 通過靜態(tài)方法創(chuàng)建,工廠無需實例化 | 復雜創(chuàng)建邏輯,需封裝且工廠無需狀態(tài) |
| 實例工廠實例化 | 通過實例方法創(chuàng)建,工廠需被 Spring 管理 | 復雜創(chuàng)建邏輯,工廠本身需要維護狀態(tài) |
| factoryBean實例化 | 實現(xiàn) FactoryBean 接口 | 能感知 Spring 容器,可注入其他 Bean,配置簡單,只需注冊 FactoryBean 本身,可集成 Spring 生命周期接口(如 DisposableBean) |
到此這篇關于Spring實例化bean的方式大全的文章就介紹到這了,更多相關Spring實例化bean內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot項目集成License授權與續(xù)期完整指南
SpringBoot項目中,通過引入第三方spring-boot-starter-license組件,可以快速實現(xiàn)系統(tǒng)權限到期控制、License 證書管理等功能,具有一定的參考價值,感興趣的可以了解一下2025-07-07
springboot獲取properties屬性值的多種方式總結
這篇文章主要介紹了springboot獲取properties屬性值的多種方式總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Java實現(xiàn)根據(jù)地址智能識別省市區(qū)縣
這篇文章主要為大家詳細介紹了如何編寫一個Java工具類,可以根據(jù)身份證地址或用戶輸入的地址,智能識別并提取出詳細的省市區(qū)縣信息,感興趣的小伙伴可以了解下2025-03-03
SpringBoot配置多個數(shù)據(jù)源超簡單步驟(連接多個數(shù)據(jù)庫)
公司項目有連接多個不同數(shù)據(jù)庫的需求,特研究了一下,根據(jù)網(wǎng)上的資料,這篇文章主要給大家介紹了關于SpringBoot配置多個數(shù)據(jù)源(連接多個數(shù)據(jù)庫)的相關資料,需要的朋友可以參考下2024-05-05

