歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Spring源碼解析 - AbstractBeanFactory 實現接口與父類分析

Spring源碼解析 - AbstractBeanFactory 實現接口與父類分析

日期:2017/3/1 9:18:09   编辑:Linux編程

我們先來看類圖吧:

除了BeanFactory這一支的接口,AbstractBeanFactory主要實現了AliasRegistry和SingletonBeanRegistry接口.

這邊主要提供了這樣的三個功能: 別名管理,單例創建與注冊,工廠方法FactoryBean支持.

我們來看看這些接口,類的主要職責吧:

BeanFactory Spring IOC容器的根接口

-- HierachicalBeanFactory 實現容器的繼承,就是可以有父 BeanFactory

-- -- ConfigureabelBeanFactory 提供factory的配置功能

AliasRegistry 定義bean name的別名管理

-- SimpleAliasRegistry 在實現別名管理接口基礎上,添加一個canonicalName查找類真是名稱api

SingletonBeanRegistry 提供單例注冊,查詢服務

-- DefaultSingletonBeanRegistry 實現單例與DisposableBean的生命周期管理(創建,維護,銷毀)

-- -- FactoryBeanRegistrySupport 添加工廠方式創建類FactoryBean的支持

-- -- -- AbstractBeanFactory BeanFactory的抽象實現.

也就是說這邊可以分為這樣幾類職責:

a, 類別名管理

b, 單例生命周期管理

c, 工廠方法初始化類對應的FactoryBean

d, BeanFactory容器

BeanFactory容器的職責(BeanFactory,HierachicalBeanFactory,ConfigureableBeanFactory)在上一篇文章<Spring源碼解析 - BeanFactory接口體系解讀>裡已經分析過,有興趣可以看下http://www.linuxidc.com/Linux/2016-03/129118.htm.

我們今天主要分析其他的三個職責,如下的接口與類(順便做目錄):

1. AliasRegistry 定義bean name的別名管理

2. SimpleAliasRegistry 實現別名管理接口

3. SingletonBeanRegistry 提供單例注冊,查詢服務

4. DefaultSingletonBeanRegistry 實現單例與DisposableBean的生命周期管理(創建,維護,銷毀)

5. FactoryBeanRegistrySupport 添加工廠方式創建類FactoryBean的支持

1. AliasRegistry 定義bean name的別名管理

提供別名的注冊,查找,刪除,判斷定義.

看個類圖就行,不用展開.

2. SimpleAliasRegistry 實現別名管理接口

這邊除了實現接口定義的api,還添加了兩個公共api:

  批量校驗別名public void resolveAliases(StringValueResolver valueResolver)和查找別名對應的原始類名public String canonicalName(String name)

這邊以別名為key緩存數據.

1     /** Map from alias to canonical name */
2     private final Map<String, String> aliasMap = new ConcurrentHashMap<String, String>(16);

分析下api實現邏輯吧:

2.1 別名注冊 registerAlias(String name, String alias)

2.2 刪除別名public void removeAlias(String alias)

  校驗下,如果別名不存在報錯:throw new IllegalStateException("No alias '" + alias + "' registered");

2.3 判斷別名是否存在

  直接使用ConcurrentHashMap的containsKey

2.4 獲取別名public String[] getAliases(String name)

  主要邏輯是加了個鎖,然後是遞歸調用retrieveAliases,查找多層次的別名(就是查找別名的別名這些下去)

2.5 使用StringValueResolver解析類名,別名後,進行循環依賴的校驗

  這邊使用的是StringValueResolver的接口,具體實現需要靠注入

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-03/129147p2.htm

Copyright © Linux教程網 All Rights Reserved