我們先來看類圖吧:
除了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