日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring IOC容器分析(1) -- BeanFactory

發布時間:2025/3/19 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring IOC容器分析(1) -- BeanFactory 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

搭建好源碼閱讀環境后,就可以慢慢走進Spring殿堂了。IOC是Inversion of Control的縮寫,控制反轉的意思。很多人可能都知道IOC是spring的核心,將對象的創建初始化等權限交由容器控制,從而減少對象之間的依賴。甚至聽說過BeanFactory,知道BeanFactory是實現IOC機制的核心,但是具體如何實現,卻不是十分清楚。下面我們來一步一步深入理解BeanFactory。

引例

在spring工程應用中,一般用spring注解@Autowired來自動加載依賴對象,如下所示:

public class MerchantController {@Autowiredprivate final MerchantService merchantService; }

注解@Autowired使得對象加載很方便,使得對象依賴間管理很容易。但是依據守恒定律,對象的加載、創建、初始化等步驟是不會減少的,這里使用簡單了,那必然在別的地方執行了對象的加載、創建、初始化的過程。實際上這個加載、創建、初始化的過程是在Spring源碼BeanFactory中完成的。

BeanFactory

首先看下BeanFactory源碼,BeanFactory是一個祖宗級接口,定義了Bean Factory的各種基本方法。spring中各種具體bean工廠均是對BeanFactory接口的實現,如DefaultListableBeanFactory,SimpleJndiBeanFactory,StaticListableBeanFactory等。

作為一個接口,BeanFactory定義的方法非常簡單,而且都是一些常用的方法模板,如:getBean(),containsBean(),isSingleton()方法。BeanFactory接口如下:

package org.springframework.beans.factory;import org.springframework.beans.BeansException; import org.springframework.core.ResolvableType;public interface BeanFactory {String FACTORY_BEAN_PREFIX = "&";Object getBean(String name) throws BeansException;<T> T getBean(String name, Class<T> requiredType) throws BeansException;<T> T getBean(Class<T> requiredType) throws BeansException;Object getBean(String name, Object... args) throws BeansException;<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;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;Class<?> getType(String name) throws NoSuchBeanDefinitionException;String[] getAliases(String name); }

顧名思義,getBean()方法是用來獲取Bean工廠中存儲的對象實例,根據name即可獲得對應的對象,也即是配置文件(暫認為xml)中定義的id。containsBean是用于判斷該Bean工廠中是否含有name所對應的對象。isSingleton是判斷該name所對應的Bean是否是共享的單例,如果true的話,當調用getBean()方法時便會返回該Bean。

由getBean()方法,應該能夠猜測出:Bean工廠是先將name-bean作為一個鍵值對存儲在一個容器中,當調用getBean()方法時,根據key值取出對應的bean值。實際上,spring中的確是這么做的。

根據UML類圖關系,找到BeanFactory接口對應的默認實現類DefaultListableBeanFactory,如下圖所示。

查看DefaultListableBeanFactory源碼,發現:屬性中beanDefinitionMap用于存儲name-bean鍵值對,也即是存放Bean工廠實例化后的bean。截取部分源碼如下:

package org.springframework.beans.factory.support;@SuppressWarnings("serial") public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {............/** Map of bean definition objects, keyed by bean name */private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);........... }

從源碼可以發現,存儲鍵值對的容器是ConcurrentHashMap,它是一個基于HashMap的高并發容器,具有很好的線程安全性。其存儲的不是String-Object鍵值對,而是String-BeanDefinition鍵值對,也就是說創建的bean對象不是以Object類型存儲的,而是Bean Definition類型存儲。為什么是這樣的呢?請聽下回分解

轉載于:https://www.cnblogs.com/hthuang/p/7807844.html

總結

以上是生活随笔為你收集整理的Spring IOC容器分析(1) -- BeanFactory的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。