接口表示一種能力,實現了一個接口,即擁有一種能力。
BeanDefinition與Bean的關係, 就比如類與對象的關係. 類在spring的數據結構就是BeanDefinition.根據BeanDefinition獲得的對象就是咱們須要的Bean.java
我認爲理解Bean與BeanDefinition是理解spring的整個架構的基礎與關鍵。我將從Bean與BeanDefinition開始慢慢撥開spring的內幕。spring
研究bean與BeanDefinition,我認爲能夠分爲兩部分來按部就班的解析。segmentfault
BeanDefinition是bean在spring中的描述,有了BeanDefinition咱們就能夠建立Bean,BeanDefinition是Bean在spring中的定義形態
接下來咱們看看BeanDefinition的相關接口與類.數據結構
向上
架構
向下
app
這裏咱們能夠關注下重寫的equals(),hashcode(), toString()方法框架
此外initMethodName屬性,destroyMethodName 屬性, 這兩個屬性bean的生命週期有關,此處只提一句,後續講解。函數
接下來。咱們看看從AbstractBeanDefinition上衍生出來的幾個類spa
表明一個xml,java Config來的BeanDefinition代理
可讓子BeanDefinition定義擁有從父母哪裏繼承配置的能力
spring2.5後註冊bean首選的是GenericBeanDefinition。GenericBeanDefinition容許動態的設置父bean.GenericBeanDefinition能夠做爲RootBeanDefinition與ChildBeanDefinition的替代品。
表示註解類型BeanDefinition。有兩個重要的屬性,AnnotationMetadata,MethodMetadata分別表示BeanDefinition的註解元信息和方法元信息
實現了此接口的BeanDefinition能夠獲取到註解元數據和方法元數據。
表示@Configuration註解註釋的BeanDefinition類
表示@Component、@Service、@Controller等註解註釋的Bean類
動做也可分爲兩種:
一種是針對自身的操做: 自提提供給外部的能夠操做其自己的動做
另外一種是外部對BeanDefinition的操做
實現類SimpleBeanDefinitionRegistry,DefaultListableBeanFactory,GenericApplicationContext等
通常實現類裏都都有一個
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap()來存儲BeanDefinition.
能夠說是高效版本的BeanDefinitionRegistry.
實現類有 XmlBeanDefinitionReader從xml中讀取BeanDefinition; PropertiesBeanDefinitionReader從Properties文件讀取BeanDefinition
對帶有註解的BeanDefinition進行註冊
能夠掃描到@Component @Repository @Service @Controller 的BeanDefinition註冊到容器中。
Bean是咱們須要的對象,是咱們從spring內獲得的結果,也就是對象實例
從定義層面看.Bean其實就是咱們須要的對象.
咱們來看看Bean在spring有哪些操做相關的接口或類。
對Bean的包裝.BeanWrapper能夠看做是一個從 BeanDefinition 到 Bean 過程當中間的產物,能夠稱爲」低級 bean「,在通常狀況下,咱們不會在實際項目中用到它。BeanWrapper 是 Spring 框架中重要的組件類,它就至關於一個代理類,Spring 委託 BeanWrapper 完成 Bean 屬性的填充工做。在 bean 實例被 InstantiatioonStrategy 建立出來後,Spring 容器會將 Bean 實例經過 BeanWrapper 包裹起來,是經過 BeanWrapper.setWrappedInstance() 完成的
BeanDefinition是物料,Bean是成品,理解BeanDefinition與Bean的關係是理解spring的基礎
。
下篇分享 物料倉庫,成品倉庫,體如今「存」的操做。
歡迎你們關注個人公衆號【源碼行動】,最新我的理解及時奉送。