国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Spring源碼分析——BeanFactory體系之接口詳細分析

2019-11-14 21:35:37
字體:
來源:轉載
供稿:網友
SPRing源碼分析——BeanFactory體系之接口詳細分析

  Spring的BeanFactory的繼承體系堪稱經典。這是眾所周知的!作為java程序員,不能錯過!

  前面的博文分析了Spring的Resource資源類Resouce。今天開始分析Spring的IOC部分。眾所周知,IOC是Spring框架最迷人的地方。它最重要的接口,就是BeanFactory了。BeanFactory有著龐大的繼承、實現體系,有眾多的子接口、實現類。本博文的目標就是抽絲剝繭,從源代碼入手,分析Spring的實現和架構,從中進步。

  在閱讀的過程中,可以參照Spring文檔來一起學習:Spring3.1.1文檔

  本人英文水平有限,部分翻譯可能不恰當,歡迎指出!

一、BeanFactory的基本類體系結構(接口為主)

  這是我畫的BeanFactory基本的類體系結構,這里沒有包括強大的applicationContext體系,ApplicationContext我準備放到下一篇再分析。

具體:

  1、BeanFactory作為一個主接口不繼承任何接口,暫且稱為一級接口

  2、有3個子接口繼承了它,進行功能上的增強。這3個子接口稱為二級接口

  3、ConfigurableBeanFactory可以被稱為三級接口,對二級接口HierarchicalBeanFactory進行了再次增強,它還繼承了另一個外來的接口SingletonBeanRegistry

  4、ConfigurableListableBeanFactory是一個更強大的接口,繼承了上述的所有接口,無所不包,稱為四級接口

  (這4級接口是BeanFactory的基本接口體系。繼續,下面是繼承關系的2個抽象類和2個實現類:)

  5、AbstractBeanFactory作為一個抽象類,實現了三級接口ConfigurableBeanFactory大部分功能。

  6、AbstractAutowireCapableBeanFactory同樣是抽象類,繼承自AbstractBeanFactory,并額外實現了二級接口AutowireCapableBeanFactory

  7、DefaultListableBeanFactory繼承自AbstractAutowireCapableBeanFactory,實現了最強大的四級接口ConfigurableListableBeanFactory,并實現了一個外來接口BeanDefinitionRegistry,它并非抽象類。

  8、最后是最強大的xmlBeanFactory,繼承自DefaultListableBeanFactory,重寫了一些功能,使自己更強大。

總結:

  BeanFactory的類體系結構看似繁雜混亂,實際上由上而下井井有條,非常容易理解。

二、IOC的始祖——BeanFactory

  來看一下BeanFactory的源碼,這么牛逼哄哄的接口就不折疊了吧:

package%20org.springframework.beans.factory;public%20interface%20BeanFactory%20{%20%20%20%20/**%20%20%20%20%20*%20用來引用一個實例,或把它和工廠產生的Bean區分開,就是說,如果一個FactoryBean的名字為a,那么,&a會得到那個Factory%20%20%20%20%20*/%20%20%20%20String%20FACTORY_BEAN_PREFIX%20=%20"&";%20%20%20%20/*%20%20%20%20%20*%20四個不同形式的getBean方法,獲取實例%20%20%20%20%20*/%20%20%20%20Object%20getBean(String%20name)%20throws%20BeansException;%20%20%20%20<T>%20T%20getBean(String%20name,%20Class<T>%20requiredType)%20throws%20BeansException;%20%20%20%20<T>%20T%20getBean(Class<T>%20requiredType)%20throws%20BeansException;%20%20%20%20Object%20getBean(String%20name,%20Object...%20args)%20throws%20BeansException;%20%20%20%20boolean%20containsBean(String%20name);%20//%20是否存在%20%20%20%20boolean%20isSingleton(String%20name)%20throws%20NoSuchBeanDefinitionException;//%20是否為單實例%20%20%20%20boolean%20isPrototype(String%20name)%20throws%20NoSuchBeanDefinitionException;//%20是否為原型(多實例)%20%20%20%20boolean%20isTypeMatch(String%20name,%20Class<?>%20targetType)%20%20%20%20%20%20%20%20%20%20%20%20throws%20NoSuchBeanDefinitionException;//%20名稱、類型是否匹配%20%20%20%20Class<?>%20getType(String%20name)%20throws%20NoSuchBeanDefinitionException;%20//%20獲取類型%20%20%20%20String[]%20getAliases(String%20name);//%20根據實例的名字獲取實例的別名}

具體:

  1、4個獲取實例的方法。getBean的重載方法。

  2、4個判斷的方法。判斷是否存在,是否為單例、原型,名稱類型是否匹配。

  3、1個獲取類型的方法、一個獲取別名的方法。根據名稱獲取類型、根據名稱獲取別名。一目了然!

總結:

  這10個方法,很明顯,這是一個典型的工廠模式的工廠接口。

三、可將Bean逐一列出的工廠——ListableBeanFactory

源碼:

public interface ListableBeanFactory extends BeanFactory {    boolean containsBeanDefinition(String beanName); // 對于給定的名字是否含有BeanDefinition    int getBeanDefinitionCount(); // 返回工廠的BeanDefinition總數    String[] getBeanDefinitionNames(); // 返回工廠中所有Bean的名字    String[] getBeanNamesForType(Class<?> type); // 返回對于指定類型Bean(包括子類)的所有名字    /*     * 返回指定類型的名字 includeNonSingletons為false表示只取單例Bean,true則不是     * allowEagerInit為true表示立刻加載,false表示延遲加載。 注意:FactoryBeans都是立刻加載的。     */    String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons,            boolean allowEagerInit);    <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException; // 根據類型(包括子類)返回指定Bean名和Bean的Map    <T> Map<String, T> getBeansOfType(Class<T> type,            boolean includeNonSingletons, boolean allowEagerInit)            throws BeansException;    Map<String, Object> getBeansWithAnnotation(            Class<? extends Annotation> annotationType) throws BeansException; // 根據注解類型,查找所有有這個注解的Bean名和Bean的Map    <A extends Annotation> A findAnnotationOnBean(String beanName,            Class<A> annotationType);// 根據指定Bean名和注解類型查找指定的Bean}
View Code

具體:

  1、3個跟BeanDefinition有關的總體操作。包括BeanDefinition的總數、名字的集合、指定類型的名字的集合。

  (這里指出,BeanDefinition是Spring中非常重要的一個類,每個BeanDefinition實例都包含一個類在Spring工廠中所有屬性。)

  2、2個getBeanNamesForType重載方法。根據指定類型(包括子類)獲取其對應的所有Bean名字。

  3、2個getBeansOfType重載方法。根據類型(包括子類)返回指定Bean名和Bean的Map。

  4、2個跟注解查找有關的方法。根據注解類型,查找Bean名和Bean的Map。以及根據指定Bean名和注解類型查找指定的Bean。

總結:

  正如這個工廠接口的名字所示,這個工廠接口最大的特點就是可以列出工廠可以生產的所有實例。當然,工廠并沒有直接提供返回所有實例的方法,也沒這個必要。它可以返回指定類型的所有的實例。而且你可以通過getBeanDefinitionNames()得到工廠所有bean的名字,然后根據這些名字得到所有的Bean。這個工廠接口擴展了BeanFactory的功能,作為上文指出的BeanFactory二級接口,有9個獨有的方法,擴展了跟BeanDefinition的功能,提供了BeanDefinition、BeanName、注解有關的各種操作。它可以根據條件返回Bean的集合,這就是它名字的由來——ListableBeanFactory。

四、分層的Bean工廠——HierarchicalBeanFactory

源碼:

public interface HierarchicalBeanFactory extends BeanFactory {    BeanFactory getParentBeanFactory();    //  返回本Bean工廠的父工廠    boolean containsLocalBean(String name);    //  本地工廠是否包含這個Bean}
View Code

具體:

  1、第一個方法返回本Bean工廠的父工廠。這個方法實現了工廠的分層。

  2、第二個方法判斷本地工廠是否包含這個Bean(忽略其他所有父工廠)。這也是分層思想的體現。

總結:這個工廠接口非常簡單,實現了Bean工廠的分層。這個工廠接口也是繼承自BeanFacotory,也是一個二級接口,相對于父接口,它只擴展了一個重要的功能——工廠分層。

五、自動裝配的Bean工廠——AutowireCapableBeanFactory

源碼:

public interface AutowireCapableBeanFactory extends BeanFactory {    int AUTOWIRE_NO = 0;   //  這個常量表明工廠沒有自動裝配的Bean    int AUTOWIRE_BY_NAME = 1;  //表明根據名稱自動裝配    int AUTOWIRE_BY_TYPE = 2;  //表明根據類型自動裝配    int AUTOWIRE_CONSTRUCTOR = 3;  //表明根據構造方法快速裝配    @Deprecated    int AUTOWIRE_AUTODETECT = 4;   //表明通過Bean的class的內部來自動裝配(有沒翻譯錯...)Spring3.0被棄用。    <T> T createBean(Class<T> beanClass) throws BeansException;    //  根據指定Class創建一個全新的Bean實例    void autowireBean(Object existingBean) throws BeansException;  //  給定對象,根據注釋、后處理器等,進行自動裝配    /*     * 根據Bean名的BeanDefinition裝配這個未加工的Object,執行回調和各種后處理器。     */    Object configureBean(Object existingBean, String beanName) throws BeansException;    /*     * 分解Bean在工廠中定義的這個指定的依賴descriptor     */    Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;    /*     * 根據給定的類型和指定的裝配策略,創建一個新的Bean實例     */    Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;    /*     * 與上面類似,不過稍有不同。     */    Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;    /*     * 根據名稱或類型自動裝配     */    void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)            throws BeansException;    /*     * 也是自動裝配     */    void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;    /*     * 初始化一個Bean...     */    Object initializeBean(Object existingBean, String beanName) throws BeansException;    /*     * 初始化之前執行BeanPostProcessors     */    Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)            throws BeansException;    /*     * 初始化之后執行BeanPostProcessors     */    Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)            throws BeansException;    /*     * 分解指定的依賴     */    Object resolveDependency(DependencyDescriptor descriptor, String beanName,            Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;}
View Code

具體:

  1、總共5個靜態不可變常量來指明裝配策略,其中一個常量被Spring3.0廢棄、一個常量表示沒有自動裝配,另外3個常量指明不同的裝配策略——根據名稱、根據類型、根據構造方法。

  2、8個跟自動裝配有關的方法,實在是繁雜,具體的意義我們研究類的時候再分辨吧。

  3、2個執行BeanPostProcessors的方法。

  4、2個分解指定依賴的方法

總結:這個工廠接口繼承自BeanFacotory,它擴展了自動裝配的功能,根據類定義BeanDefinition裝配Bean、執行前、后處理器等。

六、復雜的配置Bean工廠——ConfigurableBeanFactory

源碼:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 射洪县| 宜州市| 射阳县| 固安县| 龙江县| 营口市| 什邡市| 司法| 徐州市| 宝坻区| 东山县| 西平县| 东阿县| 沁水县| 富裕县| 昌吉市| 海原县| 乐山市| 晋城| 巴青县| 华容县| 铜鼓县| 金山区| 清涧县| 古田县| 崇信县| 锡林浩特市| 洛阳市| 孙吴县| 龙南县| 绿春县| 荥经县| 祥云县| 麻栗坡县| 小金县| 扎鲁特旗| 临洮县| 临安市| 隆安县| 桑日县| 连南|