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

詳解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)文章

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

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

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

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

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

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

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

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

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

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

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

    JavaWeb中的常用的請(qǐng)求傳參注解說明

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

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

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

    Java中DecimalFormat用法詳解

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

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

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

    JAVA生成pdf文件的實(shí)操教程

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

最新評(píng)論

泸州市| 集贤县| 金堂县| 郯城县| 衡阳市| 郁南县| 杭州市| 苏尼特左旗| 郓城县| 扎鲁特旗| 象山县| 鄂温| 观塘区| 衡阳市| 兴海县| 德清县| 游戏| 德昌县| 遂川县| 陆良县| 扬中市| 青川县| 达拉特旗| 济宁市| 米泉市| 永清县| 枣庄市| 南阳市| 嘉兴市| 千阳县| 大姚县| 旺苍县| 双峰县| 绥宁县| 海宁市| 宾川县| 祁阳县| 湘潭市| 库伦旗| 台北县| 阿瓦提县|