最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引言

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

一、什么是 FactoryBean?

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

核心方法

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

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

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

二、FactoryBean 的典型使用場景

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

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

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

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

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

2. 實現(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 對象
FactoryBean<?> factory = context.getBean("&teslaCar", FactoryBean.class); // 獲取 FactoryBean 本身

四、注意事項

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

總結(jié)

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

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

相關(guān)文章

  • Java中的原子性、可見性和有序性示例詳解

    Java中的原子性、可見性和有序性示例詳解

    原子性、可見性、有序性是多線程編程中最重要的幾個知識點,由于多線程情況復(fù)雜,如何讓每個線程能看到正確的結(jié)果,這是非常重要的,這篇文章主要介紹了Java中原子性、可見性和有序性的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • 簡單理解Java的垃圾回收機(jī)制與finalize方法的作用

    簡單理解Java的垃圾回收機(jī)制與finalize方法的作用

    這篇文章主要介紹了簡單理解Java的垃圾回收機(jī)制與finalize方法的作用,著重講解了Java的GC銷毀對象的過程,需要的朋友可以參考下
    2015-11-11
  • 使用Java實現(xiàn)生命游戲串行代碼示例

    使用Java實現(xiàn)生命游戲串行代碼示例

    生命游戲是一種二維細(xì)胞自動機(jī),由英國數(shù)學(xué)家在1970年發(fā)明,在游戲的過程中,細(xì)胞會形成各種有規(guī)律的結(jié)構(gòu),展現(xiàn)出生命的復(fù)雜性和多樣性,本文通過java和JavaFX實現(xiàn)了一個簡單的生命游戲,可以直觀的觀察到細(xì)胞的迭代過程,需要的朋友可以參考下
    2024-10-10
  • 淺析SpringCloud Alibaba-Nacos 作為注冊中心示例代碼

    淺析SpringCloud Alibaba-Nacos 作為注冊中心示例代碼

    這篇文章主要介紹了SpringCloud Alibaba-Nacos 作為注冊中心示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • java 微信隨機(jī)紅包算法代碼實例

    java 微信隨機(jī)紅包算法代碼實例

    這篇文章主要介紹了java 微信隨機(jī)紅包算法的相關(guān)資料,并附實例代碼,需要的朋友可以參考下
    2016-10-10
  • JavaWeb中的常用的請求傳參注解說明

    JavaWeb中的常用的請求傳參注解說明

    這篇文章主要介紹了JavaWeb中的常用的請求傳參注解說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Springboot之@Controller注解不生效問題及解決

    Springboot之@Controller注解不生效問題及解決

    這篇文章主要介紹了Springboot之@Controller注解不生效問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Java中DecimalFormat用法詳解

    Java中DecimalFormat用法詳解

    這篇文章主要為大家詳細(xì)介紹了Java中DecimalFormat的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 基于Java編寫一個神奇的代碼恢復(fù)工具

    基于Java編寫一個神奇的代碼恢復(fù)工具

    這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫一個神奇的代碼恢復(fù)工具,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • JAVA生成pdf文件的實操教程

    JAVA生成pdf文件的實操教程

    PDF是可移植文檔格式,是一種電子文件格式,具有許多其他電子文檔格式無法相比的優(yōu)點,下面這篇文章主要給大家介紹了關(guān)于JAVA生成pdf文件的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評論

思茅市| 遂平县| 莎车县| 正镶白旗| 高密市| 万州区| 自贡市| 梁河县| 咸宁市| 石家庄市| 乐清市| 瓦房店市| 布尔津县| 武山县| 中阳县| 中超| 繁昌县| 永年县| 英山县| 崇礼县| 牟定县| 永和县| 宜川县| 时尚| 广汉市| 尖扎县| 肃宁县| 景谷| 华安县| 内乡县| 富顺县| 铁力市| 安平县| 将乐县| 嘉峪关市| 温泉县| 农安县| 南昌县| 合肥市| 唐山市| 娄底市|