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

