通俗理解spring源碼(一)—— 容器的基本實現 大家都知道spring的主要功能就是將本來由我們程式員new出來的對象,交給spring管理。這個管理不僅包括實例化的過程,還包括依賴註入等整個bean生命周期的管理。而spring是通過一個容器,來管理所有bean的。 spring容器的概念,和 ...
通俗理解spring源碼(一)—— 容器的基本實現
大家都知道spring的主要功能就是將本來由我們程式員new出來的對象,交給spring管理。這個管理不僅包括實例化的過程,還包括依賴註入等整個bean生命周期的管理。而spring是通過一個容器,來管理所有bean的。
spring容器的概念,和現實生活中容器的概念是差不多的,即一個可容納物體的東西,杯子可以裝水,杯子是個容器,衣櫃可以裝衣服,衣櫃是一個容器。那麼抽象到java中,能存放對象的東西,就是一個容器,在spring中,容器通常用map或list等集合來實現,然後再通過一個對象來引用這個集合,那麼這個對象也叫做一個容器,spring把這個對象叫做beanFactory。
那麼這個容器是如何初始化的?簡單一句話就是,通過我們配置的xml文件或者註解,來告訴spring你想實例化怎樣的一個bean?這個bean的屬性是怎樣的?與其他bean的依賴關係?等等,spring通過一系列複雜的過程,初始化該容器,我們需要什麼對象,直接從容器中拿就好了。
關於spring的容器,涉及的類就多了,我的學習方法是,先不看具體的方法和實現,首先從一些核心的介面和抽象類著手,配合類的層次結構圖,瞭解整體的結構和功能。而關於這些介面和抽象類,首先從名稱上就能大致知道其功能,因為spring官方的命名是非常規範的, 所以有一定的英語基礎對學習源碼是很有幫助的。瞭解了這些介面的功能後,在源碼中看到這個名稱,就知道是乾什麼的了,不至於跳來跳去,而暈頭轉向。
真正的容器是DefaultListableBeanFactory,他是通過層層繼承而來的,從上圖可以很清晰的(請選擇性忽略圖片的清晰度)從全局角度瞭解DefaultListableBeanFactory的脈絡,他的父親、爺爺、曾爺爺都在上面了,只要知道了他祖宗十八代的功能,就可以知道DefaultListableBeanFactory的功能了。
- AliasRegistry:別名註冊中心,註冊中心相當於登記處,提供了對別名的註冊,還包括增刪改查等操作,由於介面中不能有成員變數(非常量),所以一定會有一個實現類中通過一個容器保存別名,其他介面也類似。
- SimpleAliasRegistry:簡單別名註冊中心,是介面AliasRegistry的實現,增加了一個map容器來保存別名。
- SingletonBeanRegistry:單例bean的註冊中心,顧名思義,該介面定義了對單例bean的註冊及獲取,
- BeanFactory:bean的工廠,用來存放bean,定義獲取bean及bean的各種屬性。
- DefaultSingletonBeanRegistry:為SingletonBeanRegistry的預設實現,定義了一個容器保存所有單例bean,同時繼承了SimpleAliasRegistry,所以該類既是一個單例bean的註冊中心,也是別名的註冊中心。
- HierarchicalBeanFactory:有層級的bean工廠,在BeanFactory定義的功能的基礎上增加了對parentFactory的支持。
- BeanDefinitionRegistry:BeanDefinition的註冊中心,定義對BeanDefinition的增刪改查(BeanDefinition就是對bean的描述,包括bean的class、scope、id等,以後會詳細介紹)。
- FactoryBeanRegistrySupport:FactoryBean註冊的支持,在DefaultSingletonBeanRegistry基礎上增加了對FactoryBean的特殊處理功能(FactoryBean是工廠bean,BeanFactory是bean工廠,以後會詳細介紹)。
- ConfigurableBeanFactory:可配置的bean工廠,提供配置Factory的各種方法。
- ListableBeanFactory:可列舉的bean工廠,提供了getBean等根據各種條件獲取bean的方法。
- AbstractBeanFactory:抽象bean工廠,綜合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能;
- AutowireCapableBeanFactory:可自動註入的bean工廠,提供創建bean、自動註入、初始化以及應用bean的後處理器。
- AbstractAutowireCapableBeanFactory:抽象的可自動註入的bean工廠,綜合AbstractBeanFactory並對介面AutowireCapableBeanFactory進行實現。
- ConfigurableListableBeanFactory:可配置、可列舉的bean工廠,beanFactory配置清單,指定忽略類型及介面等。
- DefaultListableBeanFactory:綜合上面所有功能,即可配置、可列舉、可處理依賴註入、可處理factoryBean,既是bean工廠,也是BeanDefinition、Alias的註冊中心,還能引用父容器。是真正的spring容器,beanDefinition的註冊以及單例bean的實例化等功能都由他來完成。
到目前為止,只是介紹了與spring容器相關核心類的大致介紹,個人覺得看完後只要有個大致印象,看到某個介面名或類名,能夠記起他的大致功能,那麼本文的目的就達到了。
接下來的博客中,會從載入xml配置文件開始,解開spring容器初始化的謎底。
參考:spring源碼深度解析。