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

Spring中的BeanFactory類入門到精通

 更新時(shí)間:2025年12月18日 17:14:41   作者:yifanghub  
BeanFactory是Spring框架的IoC容器接口,提供Bean的生命周期管理、依賴注入和配置元數(shù)據(jù),它支持懶加載策略,并通過實(shí)現(xiàn)類如DefaultListableBeanFactory來完成具體的Bean創(chuàng)建和依賴注入,本文介紹Spring中的BeanFactory類,感興趣的朋友跟隨小編一起看看吧

一、BeanFactory 是什么?

BeanFactory 是 Spring 框架中最頂層的 IoC(Inversion of Control)容器接口,位于 org.springframework.beans.factory 包下。它是 Spring 管理 Bean 生命周期、依賴注入和配置元數(shù)據(jù)的核心入口。
根據(jù) Spring 官方 Javadoc 的描述:

The root interface for accessing a Spring bean container. This is the basic client view of a bean container;

直譯過來就是:BeanFactory 是訪問 Spring Bean 容器的根接口,是容器對(duì)外暴露的最基礎(chǔ)視圖。

Bean的源碼:

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;
	String[] getAliases(String name);
}

從這些方法可以看出,其核心職責(zé)包括:

  • 根據(jù)名稱或類型獲取 Bean 實(shí)例(getBean()
  • 判斷容器是否包含某個(gè) Bean(containsBean()
  • 獲取 Bean 的作用域、是否單例等元信息
  • 采用懶加載策略(只有在首次調(diào)用 getBean() 時(shí)才會(huì)實(shí)例化 Bean)

值得注意的是,BeanFactory本身并不負(fù)責(zé) Bean 的創(chuàng)建過程,而是提供一個(gè)統(tǒng)一的訪問入口。真正的 Bean 創(chuàng)建、依賴注入、生命周期管理由其實(shí)現(xiàn)類完成。

二、BeanFactory 的接口體系結(jié)構(gòu)

BeanFactory接口繼承體系

BeanFactory
├── HierarchicalBeanFactory          // 支持父子容器層級(jí)結(jié)構(gòu)
├── ListableBeanFactory              // 支持枚舉容器中所有 Bean
├── AutowireCapableBeanFactory       // 支持自動(dòng)裝配(可用于非 Spring 管理對(duì)象)
└── ConfigurableBeanFactory          // 支持配置(如設(shè)置父工廠、類加載器等)
     └── ConfigurableListableBeanFactory

1. ListableBeanFactory

提供按類型或名稱獲取多個(gè)Bean的方法,可以將容器中的Bean全部取出

public interface ListableBeanFactory extends BeanFactory {
    // 按類型獲取所有Bean
    String[] getBeanNamesForType(Class<?> type);
    // 按類型獲取所有Bean,包含子類
    String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
    // 按類型獲取所有Bean實(shí)例
    <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
    // 獲取所有Bean定義的名稱
    String[] getBeanDefinitionNames();
    // 獲取Bean定義的數(shù)量
    int getBeanDefinitionCount();
}

2. HierarchicalBeanFactory

支持分層Bean工廠,允許有父工廠:

public interface HierarchicalBeanFactory extends BeanFactory {
    // 獲取父工廠
    BeanFactory getParentBeanFactory();
    // 判斷是否包含指定名稱的Bean(包括父工廠)
    boolean containsLocalBean(String name);
}

3. ConfigurableBeanFactory

提供配置功能:如設(shè)置 ClassLoader、BeanPostProcessor、作用域注冊(cè)等。

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
    // 設(shè)置Bean類加載器
    void setBeanClassLoader(ClassLoader beanClassLoader);
    // 設(shè)置臨時(shí)類加載器
    void setTempClassLoader(ClassLoader tempClassLoader);
    // 設(shè)置Bean后處理器
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
    // 銷毀單例Bean
    void destroySingletons();
}

SingletonBeanRegistry 提供對(duì)單例 Bean 的注冊(cè)和銷毀能力,是實(shí)現(xiàn)單例模式的關(guān)鍵接口。

4. AutowireCapableBeanFactory

允許對(duì)任意 Java 對(duì)象執(zhí)行 Spring 的依賴注入(即使該對(duì)象不是由 Spring 容器創(chuàng)建的)。常用于集成第三方庫。

public interface AutowireCapableBeanFactory extends BeanFactory {
    // 創(chuàng)建Bean實(shí)例
    Object createBean(Class<?> beanClass) throws BeansException;
    // 自動(dòng)裝配Bean屬性
    void autowireBean(Object existingBean) throws BeansException;
    // 應(yīng)用Bean后處理器
    Object initializeBean(Object existingBean, String beanName) throws BeansException;
    // 銷毀Bean
    void destroyBean(Object existingBean);
}

三、BeanFactory 的核心實(shí)現(xiàn)體系

雖然 BeanFactory 是接口,但 Spring 提供了多個(gè)實(shí)現(xiàn)類,其中最重要的是:

1. DefaultListableBeanFactory

這是BeanFactory最常用的實(shí)現(xiàn)類,實(shí)現(xiàn)了ListableBeanFactory、ConfigurableBeanFactory等接口:

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
        implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
    // Bean定義的存儲(chǔ)
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
    // Bean名稱的存儲(chǔ)順序
    private final List<String> beanDefinitionNames = new ArrayList<>(256);
    // 省略其他實(shí)現(xiàn)...
}

這是Spring 內(nèi)部最核心、最完整的BeanFactory 實(shí)現(xiàn),也是ApplicationContext(如 ClassPathXmlApplicationContext)內(nèi)部實(shí)際使用的工廠。

  • 內(nèi)部維護(hù) BeanDefinition 注冊(cè)表(Map<String, BeanDefinition>)
  • 支持依賴解析、循環(huán)依賴處理(通過三級(jí)緩存)、作用域管理等完整功能

2. XmlBeanFactory(已過時(shí))

基于XML配置文件的Bean工廠實(shí)現(xiàn),現(xiàn)在已被ClassPathXmlApplicationContext等替代:

public class XmlBeanFactory extends DefaultListableBeanFactory {
    private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
    public XmlBeanFactory(Resource resource) throws BeansException {
        this(resource, null);
    }
    public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        this.reader.loadBeanDefinitions(resource);
    }
}

官方建議改用ClassPathXmlApplicationContext,因其提供了更完整的生命周期管理和事件機(jī)制。

3. 其他輕量級(jí)實(shí)現(xiàn)

  • StaticListableBeanFactory:手動(dòng)注冊(cè) Bean 實(shí)例,適用于測(cè)試或簡(jiǎn)單場(chǎng)景
  • SimpleJndiBeanFactory:從 JNDI 查找 Bean(主要用于傳統(tǒng) Java EE 環(huán)境)

另外還有兩個(gè)抽象實(shí)現(xiàn)類

AbstractBeanFactory

關(guān)鍵職責(zé):

  • 實(shí)現(xiàn)了單例Bean的緩存機(jī)制
  • 實(shí)現(xiàn)了 ConfigurableBeanFactory 接口的大部分通用邏輯。
  • 提供了 getBean() 方法的主干流程(模板方法模式),但將具體實(shí)例化、依賴解析等委托給子類。
  • 重要方法:
public Object getBean(String name) throws BeansException {
    return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(...) { ... } // 模板方法,子類需實(shí)現(xiàn) createBean()

AbstractAutowireCapableBeanFactory

定位:在 AbstractBeanFactory 基礎(chǔ)上,增加了 自動(dòng)裝配(Autowiring) 和 Bean 生命周期管理 能力。
關(guān)鍵職責(zé):

  • 實(shí)現(xiàn)了AutowireCapableBeanFactory 接口
  • 提供完整的 Bean 創(chuàng)建流程:實(shí)例化 → 屬性填充 → 初始化邏輯執(zhí)行(創(chuàng)建Bean的核心三個(gè)步驟)。
  • 實(shí)現(xiàn)循環(huán)依賴的核心邏輯(通過三級(jí)緩存)。
  • 典型子類:DefaultListableBeanFactory
  • 核心方法
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)

四、小結(jié)

  • BeanFactory 是規(guī)范(接口契約)
  • AbstractBeanFactory 定義了流程(模板方法)
  • AbstractAutowireCapableBeanFactory 提供了核心實(shí)現(xiàn)骨架(Bean 創(chuàng)建、依賴注入、生命周期)
  • DefaultListableBeanFactory 是功能完整的最終實(shí)現(xiàn)(注冊(cè)表 + 所有能力)

到此這篇關(guān)于Spring中的BeanFactory類入門到精通的文章就介紹到這了,更多相關(guān)Spring BeanFactory類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot 中的橫切邏輯統(tǒng)一治理方案

    Spring Boot 中的橫切邏輯統(tǒng)一治理方案

    攔截器是Spring框架提供的核心功能之一,核心用于統(tǒng)一攔截用戶的請(qǐng)求,文章主要介紹了Spring框架中的攔截器、統(tǒng)一數(shù)據(jù)返回格式和統(tǒng)一異常處理,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • SpringCloud使用Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用流程詳細(xì)介紹

    SpringCloud使用Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用流程詳細(xì)介紹

    OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成
    2023-02-02
  • Spring中的@Qualifier注解詳解

    Spring中的@Qualifier注解詳解

    這篇文章主要介紹了Spring中的@Qualifier注解詳解,spring?@Autowire?的注解默認(rèn)是按類型注入bean,本文將對(duì)其使用方法進(jìn)行說明,需要的朋友可以參考下
    2023-11-11
  • IDEA中的yml文件與properties互相轉(zhuǎn)換

    IDEA中的yml文件與properties互相轉(zhuǎn)換

    這篇文章主要介紹了IDEA中的yml文件與properties互相轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • java中Future使用方法舉例詳細(xì)介紹

    java中Future使用方法舉例詳細(xì)介紹

    Future是java5新加的一個(gè)接口,提供了異步并行計(jì)算的功能,這篇文章主要介紹了java中Future使用方法紹的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • SpringSecurity自定義登錄界面

    SpringSecurity自定義登錄界面

    這篇文章主要為大家詳細(xì)介紹了SpringSecurity自定義登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 使用javax.sound實(shí)現(xiàn)簡(jiǎn)單音頻播放

    使用javax.sound實(shí)現(xiàn)簡(jiǎn)單音頻播放

    這篇文章主要為大家詳細(xì)介紹了使用javax.sound實(shí)現(xiàn)簡(jiǎn)單音頻播放,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • SimpleDateFormat在多線程下的安全問題及解決

    SimpleDateFormat在多線程下的安全問題及解決

    SimpleDateFormat類在Java中用于日期時(shí)間的格式化和解析,但在高并發(fā)環(huán)境下存在線程不安全的問題,原因是它共享了一個(gè)Calendar對(duì)象,導(dǎo)致多個(gè)線程操作時(shí)出現(xiàn)沖突,為了解決這個(gè)問題,可以使用局部變量、加鎖或使用線程安全的DateTimeFormatter類
    2026-03-03
  • 基于Java SSM框架開發(fā)圖書借閱系統(tǒng)源代碼

    基于Java SSM框架開發(fā)圖書借閱系統(tǒng)源代碼

    本文給大家介紹了基于Java SSM框架開發(fā)圖書借閱系統(tǒng),開發(fā)環(huán)境基于idea2020+mysql數(shù)據(jù)庫,前端框架使用bootstrap4框架,完美了實(shí)現(xiàn)圖書借閱系統(tǒng),喜歡的朋友快來體驗(yàn)吧
    2021-05-05
  • 分布式之全面了解Kafka的使用與特性

    分布式之全面了解Kafka的使用與特性

    Kafka?是我工作多年使用最多的消息中間件?,特點(diǎn)是擁有巨大吞吐量(數(shù)百萬/秒),作為當(dāng)下最流行的分布式,可水平擴(kuò)展,可容錯(cuò)的“消息系統(tǒng)”,下面跟隨小編看下分布式之全面了解Kafka的使用與特性
    2021-11-11

最新評(píng)論

吴堡县| 湖北省| 石泉县| 高清| 旺苍县| 日照市| 嘉荫县| 读书| 奇台县| 绵竹市| 开封市| 城固县| 绥宁县| 楚雄市| 鲁山县| 泸溪县| 叙永县| 宝兴县| 和硕县| 宜兰县| 库伦旗| 侯马市| 崇文区| 兴仁县| 丘北县| 仲巴县| 宜川县| 桃江县| 五华县| 乳山市| 鄂尔多斯市| 缙云县| 中阳县| 钦州市| 沽源县| 花垣县| 定兴县| 湘潭县| 会宁县| 日土县| 东光县|