欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Spring FactoryBean靈活創(chuàng)建復(fù)雜對(duì)象的秘密武器

 更新時(shí)間:2025年02月18日 09:34:35   作者:冬天vs不冷  
FactoryBean是Spring框架中用于創(chuàng)建復(fù)雜Bean的接口,通過編程方式控制Bean的創(chuàng)建過程,它允許開發(fā)者自定義Bean的創(chuàng)建邏輯,適用于集成第三方庫、延遲初始化、動(dòng)態(tài)代理和統(tǒng)一管理資源等場(chǎng)景,本文介紹Spring FactoryBean創(chuàng)建復(fù)雜對(duì)象的相關(guān)操作,感興趣的朋友一起看看吧

引言

  在 Spring 框架中,Bean 的創(chuàng)建通常由容器直接通過反射機(jī)制完成。然而,某些場(chǎng)景下對(duì)象的創(chuàng)建邏輯較為復(fù)雜(例如需要依賴外部資源、動(dòng)態(tài)代理或定制化初始化流程),此時(shí)直接通過 @Bean 注解可能無法滿足需求。FactoryBean 是 Spring 提供的一個(gè)強(qiáng)大接口,允許開發(fā)者通過編程方式控制 Bean 的創(chuàng)建過程。

一、什么是 FactoryBean?

  FactoryBean 是 Spring 框架中的一個(gè)接口(位于 org.springframework.beans.factory 包),用于創(chuàng)建復(fù)雜對(duì)象。與普通 Bean 不同,它本身是一個(gè)“工廠”,負(fù)責(zé)生成另一個(gè) Bean 的實(shí)例。

核心方法

public interface FactoryBean<T> {
    T getObject() throws Exception;    // 返回實(shí)際對(duì)象
    Class<?> getObjectType();          // 返回對(duì)象類型
    boolean isSingleton();             // 是否單例
}

FactoryBean 與普通 Bean 的區(qū)別

  • 普通 Bean:容器直接實(shí)例化并管理其生命周期
  • FactoryBean:容器會(huì)調(diào)用其 getObject() 方法返回目標(biāo)對(duì)象
    • 當(dāng)定義一個(gè)名為 myFactoryBean 的 FactoryBean 時(shí),applicationContext.getBean("myFactoryBean") 返回的是 getObject() 的結(jié)果
    • 若需獲取 FactoryBean 本身,需使用 applicationContext.getBean("&myFactoryBean")(名稱前加 &

二、FactoryBean 的典型使用場(chǎng)景

  • 集成第三方庫
    • 例如 MyBatis 的 SqlSessionFactoryBean,用于創(chuàng)建復(fù)雜的 SqlSessionFactory 對(duì)象
  • 延遲初始化與復(fù)雜邏輯
    • 當(dāng)對(duì)象的創(chuàng)建需要讀取配置、連接數(shù)據(jù)庫或計(jì)算參數(shù)時(shí),可通過 FactoryBean 封裝邏輯
  • 動(dòng)態(tài)代理生成對(duì)象
    • 例如 Spring AOP 中的 ProxyFactoryBean,用于生成代理對(duì)象
  • 統(tǒng)一管理資源
    • 如創(chuàng)建需要連接外部服務(wù)的客戶端對(duì)象(如 Redis、HTTP 客戶端)

三、實(shí)戰(zhàn)案例:自定義 FactoryBean

假設(shè)我們需要根據(jù)配置動(dòng)態(tài)創(chuàng)建不同品牌的 Car 對(duì)象,以下是實(shí)現(xiàn)步驟

1. 定義目標(biāo)對(duì)象

public class Car {
    private String brand;
    private int maxSpeed;
    // 省略構(gòu)造方法、Getter/Setter
}

2. 實(shí)現(xiàn) FactoryBean 接口

public class CarFactoryBean implements FactoryBean<Car> {
    private String brand;
    private int maxSpeed;
    // 通過屬性注入配置值
    public void setBrand(String brand) { this.brand = brand; }
    public void setMaxSpeed(int maxSpeed) { this.maxSpeed = maxSpeed; }
    @Override
    public Car getObject() throws Exception {
        // 復(fù)雜初始化邏輯(此處僅為示例)
        return new Car(brand, maxSpeed);
    }
    @Override
    public Class<?> getObjectType() {
        return Car.class;
    }
    @Override
    public boolean isSingleton() {
        return true; // 單例模式
    }
}

3. 注解配置方式

@Configuration
public class AppConfig {
    @Bean
    public CarFactoryBean teslaCar() {
        CarFactoryBean factory = new CarFactoryBean();
        factory.setBrand("Tesla");
        factory.setMaxSpeed(250);
        return factory;
    }
}

4. 獲取 Bean

ApplicationContext context = ...;
Car car = context.getBean("teslaCar", Car.class); // 獲取的是 Car 對(duì)象
FactoryBean<?> factory = context.getBean("&teslaCar", FactoryBean.class); // 獲取 FactoryBean 本身

四、注意事項(xiàng)

  • 區(qū)分 FactoryBean 與目標(biāo) Bean
    • 使用 & 前綴獲取 FactoryBean 實(shí)例本身
  • 避免重復(fù)創(chuàng)建
    • isSingleton() 返回 true,確保 getObject() 方法每次返回同一實(shí)例
  • 與 @Primary/@Qualifier 的兼容性
    • 注解作用于 FactoryBean 生成的目標(biāo)對(duì)象,而非 FactoryBean 本身

總結(jié)

  FactoryBean 是 Spring 中一種高級(jí)定制化機(jī)制,適用于復(fù)雜對(duì)象的創(chuàng)建場(chǎng)景。通過它,開發(fā)者可以靈活控制 Bean 的初始化過程,實(shí)現(xiàn)與第三方庫的無縫集成。理解其設(shè)計(jì)原理后,可顯著提升對(duì) Spring 容器內(nèi)部工作機(jī)制的認(rèn)識(shí)。

到此這篇關(guān)于深入理解Spring FactoryBean:靈活創(chuàng)建復(fù)雜對(duì)象的秘密武器的文章就介紹到這了,更多相關(guān)Spring FactoryBean創(chuàng)建復(fù)雜對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟

    RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟

    這篇文章主要介紹了RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • java讀取文件內(nèi)容,解析Json格式數(shù)據(jù)方式

    java讀取文件內(nèi)容,解析Json格式數(shù)據(jù)方式

    這篇文章主要介紹了java讀取文件內(nèi)容,解析Json格式數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java 中引入內(nèi)部類的意義?

    Java 中引入內(nèi)部類的意義?

    這篇文章主要介紹了Java 中引入內(nèi)部類的意義?文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • java?線程池如何執(zhí)行策略又拒絕哪些策略

    java?線程池如何執(zhí)行策略又拒絕哪些策略

    這篇文章主要介紹了java?線程池如何執(zhí)行策略又拒絕哪些策略,文章通過線程池的執(zhí)行方法?execute()?展開全篇內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • Java中ThreadLocal使用原理及Synchronized區(qū)別

    Java中ThreadLocal使用原理及Synchronized區(qū)別

    ThreadLocal叫做線程變量,本文詳細(xì)的介紹了ThreadLocal使用原理及Synchronized區(qū)別,有需要的朋友可以參考一下,希望對(duì)你有所幫助。
    2023-05-05
  • Java實(shí)現(xiàn)的貸款金額計(jì)算功能示例

    Java實(shí)現(xiàn)的貸款金額計(jì)算功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的貸款金額計(jì)算功能,結(jié)合實(shí)例形式分析了Java簡(jiǎn)單數(shù)值運(yùn)算及類型轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Spring Boot集成Kafka的示例代碼

    Spring Boot集成Kafka的示例代碼

    本篇文章主要介紹了Spring Boot集成Kafka的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 關(guān)于properties配置文件的加密方式

    關(guān)于properties配置文件的加密方式

    這篇文章主要介紹了關(guān)于properties配置文件的加密方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • SpringBoot項(xiàng)目如何將Bean注入到普通類中

    SpringBoot項(xiàng)目如何將Bean注入到普通類中

    這篇文章主要介紹了SpringBoot項(xiàng)目如何將Bean注入到普通類中,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Boot實(shí)現(xiàn)接口簽名驗(yàn)證的過程

    Spring Boot實(shí)現(xiàn)接口簽名驗(yàn)證的過程

    在Spring Boot中實(shí)現(xiàn)接口校驗(yàn)簽名通常是為了保證接口請(qǐng)求的安全性和數(shù)據(jù)的完整性,這篇文章主要介紹了Spring Boot實(shí)現(xiàn)接口簽名驗(yàn)證,需要的朋友可以參考下
    2024-04-04

最新評(píng)論