不管是基於註解的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