成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring BeanFactory 和 FactoryBean,有什么區別?

開發
本文我們了解了BeanFactory和FactoryBean的基本概念,了解了它們之間的關系,以及在實際應用中的應用場景。

在 Spring框架中,BeanFactory是什么?FactoryBean又是什么?兩個很相近的單詞,它們之間有什么關聯呢?這篇文章,我們來聊一聊。

1. BeanFactory

BeanFactory是 Spring的核心接口之一,代表了 Spring的 IoC(控制反轉)容器。它負責管理和配置應用程序中的 Bean,包括 Bean的生命周期、依賴關系和作用域。

如下圖是BeanFactory的源碼:

BeanFactory的主要方法:

public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";
    Object getBean(String name) throws BeansException;
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    Object getBean(String name, Object... args) throws BeansException;
    <T> T getBean(Class<T> requiredType) throws BeansException;
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
    <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
    <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
    boolean containsBean(String name);
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
    @Nullable
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    @Nullable
    Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
    String[] getAliases(String name);
}

BeanFactory的主要特點:

  • 基礎容器: BeanFactory是Spring容器的最基礎實現,提供了最基本的Bean管理功能。
  • 延遲加載(Lazy Initialization): 默認情況下,BeanFactory在請求Bean時才會創建它,因此適合資源占用較少的場景。
  • 輕量級: 由于功能相對簡單,BeanFactory適用于資源受限的環境,如移動設備或嵌入式系統。
  • 核心接口: 它是多個Spring容器實現(如XmlBeanFactory、ClasspathXmlApplicationContext等)的父接口。

使用示例:

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
MyBean myBean = beanFactory.getBean("myBean", MyBean.class);

在實際開發中,ApplicationContext(BeanFactory的子接口)更常用,因為它提供了更多的功能,如事件傳播、國際化支持和 Bean后處理等。

2. FactoryBean

FactoryBean也是 Spring 提供的一個接口,用于自定義復雜對象的創建邏輯。通過實現FactoryBean接口,開發者可以控制 Bean實例的創建過程,動態生成 Bean或在創建過程中進行額外的處理。

如下圖是FactoryBean的源碼:

FactoryBean的主要特點:

  • 自定義實例化邏輯: 允許開發者定義復雜的實例化過程,生成特定類型的Bean。
  • 代理對象創建: 常用于創建代理對象,如AOP中的代理。
  • 返回其他Bean: FactoryBean的getObject()方法可以返回任何對象,而不僅僅是FactoryBean本身。

FactoryBean的關鍵方法:

  • Object getObject() throws Exception;:返回由FactoryBean創建的對象。
  • Class<?> getObjectType();:返回創建對象的類型。
  • boolean isSingleton();:指示由getObject()創建的對象是否為單例。

使用示例:

如下示例,假設需要創建一個復雜的服務對象,可以通過實現FactoryBean來定制實例化過程。

public class MyServiceFactoryBean implements FactoryBean<MyService> {

    @Override
    public MyService getObject() throws Exception {
        // 自定義創建邏輯
        MyService service = new MyService();
        service.initialize();
        return service;
    }

    @Override
    public Class<?> getObjectType() {
        return MyService.class;
    }

    @Override
    public boolean isSingleton() {
        returntrue;
    }
}

在Spring配置中聲明:

<bean id="myService" class="com.example.MyServiceFactoryBean"/>

獲取MyService實例:

MyService myService = context.getBean("myService", MyService.class);

3. 兩者區別

特性

BeanFactory

FactoryBean

定義

Spring IoC容器的核心接口,用于管理和配置應用程序中的Bean。

一個Spring接口,允許開發者自定義Bean的創建邏輯,作為Bean的工廠。

角色

作為容器,負責加載、配置和管理所有的Bean。

作為Bean的一種特殊類型,用于生成其他Bean實例。

功能

提供Bean的基本管理功能,如依賴注入、生命周期管理等。

提供自定義的Bean實例化過程,可以創建復雜或動態的Bean對象。

使用場景

適用于基本的Bean管理需求,但在實際開發中通常使用更高級的ApplicationContext。

需要復雜對象創建邏輯、創建代理對象或動態生成Bean時使用。

實例類型

通常通過Spring提供的具體實現類,如XmlBeanFactory(已過時)、ClassPathXmlApplicationContext等。

任意實現了FactoryBean接口的類。

獲取Bean實例

直接通過容器的getBean方法獲取Bean實例。

通過getObject()方法由容器間接獲取Bean實例。意味著在Spring配置中聲明的FactoryBean會返回其getObject()方法所生成的對象,而不是FactoryBean本身。

4. 總結

本文,我們了解了BeanFactory和FactoryBean的基本概念,了解了它們之間的關系,以及在實際應用中的應用場景。

BeanFactory 是Spring IoC容器的核心接口,負責管理和提供Bean實例,是整個Bean管理機制的基礎。

FactoryBean 則是一個用于定制 Bean創建過程的機制,通過實現該接口,可以控制 Bean的實例化、配置甚至返回不同類型的對象。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2023-07-06 14:24:23

Spring接口自定義

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2023-10-27 07:39:44

IOC容器Spring

2023-10-16 08:16:31

Bean接口類型

2021-05-16 14:26:08

RPAIPACIO

2022-02-27 15:33:22

安全CASBSASE

2024-05-27 00:40:00

2024-09-09 13:10:14

2021-12-17 14:40:02

while(1)for(;;)語言

2024-03-05 18:59:59

前端開發localhost

2022-08-02 08:23:37

SessionCookies

2020-11-09 14:07:53

PyQtQt編程

2022-06-06 14:53:02

LoRaLoRaWAN

2020-03-09 20:56:19

LoRaLoRaWAN無線技術

2022-09-08 18:38:26

LinuxWindowsmacOS

2022-09-07 18:32:57

并發編程線程

2023-12-15 09:21:17

ObjectJavaString

2022-08-22 07:06:32

MyBatisSQL占位符

2022-08-31 08:33:54

Bash操作系統Linux

2025-04-18 10:36:15

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色频 | 久久精品视频在线播放 | 久久精品美女 | 日本精品视频一区二区 | 国产一区二区免费在线 | 懂色av色香蕉一区二区蜜桃 | 成人在线视频免费观看 | 免费成人午夜 | 伊人狠狠| 欧美一级欧美三级在线观看 | 99热都是精品 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 亚洲在线| 日韩欧美国产不卡 | 国产精品 亚洲一区 | 日韩精品一区二区三区在线观看 | 久久久久成人精品免费播放动漫 | 亚洲精品国产精品国自产在线 | 欧美久久久久久久 | 国产精品99久久久久久宅男 | 亚洲精品一二区 | 99精品国产一区二区三区 | 亚洲午夜av久久乱码 | 香蕉视频在线播放 | 337p日本欧洲亚洲大胆鲁鲁 | 国产在线视频一区二区 | 国产精品免费看 | 在线免费中文字幕 | 日韩一级欧美一级 | 久久久青草婷婷精品综合日韩 | 中文字幕在线剧情 | 在线激情视频 | 日本不卡高字幕在线2019 | 狠狠热视频 | 做a视频在线观看 | 国产精品久久国产精品 | 亚洲国产精品区 | 久色网 | 亚洲在线| 国产九九九九 | 一本一道久久a久久精品综合 |