Spring依賴注入

不管是基於註解的ApplicationContext(org.springframework.context.annotation.AnnotationConfigApplicationContext)spring

仍是基於XML的ApplicationContext(org.springframework.context.support.ClassPathXmlApplicationContext)緩存

它們在啓動過程當中都會調用org.springframework.context.support.AbstractApplicationContext#refresh方法函數

實例化Spring容器的核心方法是org.springframework.context.support.AbstractApplicationContext#refreshspa

在這個refresh方法中會獲取BeanFactory,默認的BeanFactory是org.springframework.beans.factory.support.DefaultListableBeanFactory.net

 

在AbstractApplicationContext#refresh()方法的最後會實例化容器中全部非懶加載的單例bean,它是經過調用getBean()方法來作的,下面從getBean()開始分析代理

getBean方法是在AbstractBeanFactory中定義的,而全部的getBean方法最終都是調的doGetBean方法對象

 

AbstractBeanFactory#getBeanblog

一、調用doGetBean方法遞歸

AbstractBeanFactory#doGetBeanget

一、檢查singleton緩存中是否有這個bean,若是有直接返回

二、檢查父級BeanFactory中是否有這個bean,若是有直接返回

三、檢查這個BeanDefinition是否有依賴,若是有,則遞歸的獲取這些依賴的bean(PS:經過getBean方法)直到沒有依賴爲止

四、經過createBean方法建立bean

AbstractAutowireCapableBeanFactory#createBean

一、若是設置了BeanPostProcessor,則返回一個代理對象

二、調用doCreateBean方法

AbstractAutowireCapableBeanFactory#doCreateBean

在這個方法中調用了兩個特別重要的方法createBeanInstance和populateBean,前者用於實例化Bean,後者用於初始化Bean實例

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance

一、若是指定了工廠方法的話,則用指定的工廠方法實例化Bean

二、若是構造函數使用了自動裝配的話,則使用autowireConstructor實例化Bean

三、決定以使用帶參數的構造方法實例化Bean

四、使用默認的構造方法實例化Bean

補充:

一、autowire constructor

二、用默認的構造方法實例化的時候涉及到實例化策略,默認的策略是使用cglib,還有一種是使用反射

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

這一步所作的事情就是找到那些須要注入的屬性和它所對應的實例,而後將它設置到相應的屬性上

還有一點是屬性的類型可能有多種,每一種的取值方式都不同

 參考 

http://blog.csdn.net/hotdust/article/details/52613221

http://blog.csdn.net/lisongjia123/article/details/52134396

相關文章
相關標籤/搜索