不管是基于注解的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