无论是基于注解的 ApplicationContext(org.springframework.context.annotation.AnnotationConfigApplicationContext)
还是基于 XML 的 ApplicationContext(org.springframework.context.support.ClassPathXmlApplicationContext)
它们在启动过程中都会调用 org.springframework.context.support.AbstractApplicationContext#refresh 方法
实例化 Spring 容器的核心方法是 org.springframework.context.support.AbstractApplicationContext#refresh
在这个 refresh 方法中会获取 BeanFactory, 默认的 BeanFactory 是 org.springframework.beans.factory.support.DefaultListableBeanFactory
在 AbstractApplicationContext#refresh() 方法的最后会实例化容器中所有非懒加载的单例 bean, 它是通过调用 getBean() 方法来做的, 下面从 getBean() 开始分析
getBean 方法是在 AbstractBeanFactory 中定义的, 而所有的 getBean 方法最终都是调的 doGetBean 方法
AbstractBeanFactory#getBean
1, 调用 doGetBean 方法
AbstractBeanFactory#doGetBean
1, 检查 singleton 缓存中是否有这个 bean, 如果有直接返回
2, 检查父级 BeanFactory 中是否有这个 bean, 如果有直接返回
3, 检查这个 BeanDefinition 是否有依赖, 如果有, 则递归的获取这些依赖的 bean(PS: 通过 getBean 方法) 直到没有依赖为止
4, 通过 createBean 方法创建 bean
AbstractAutowireCapableBeanFactory#createBean
1, 如果设置了 BeanPostProcessor, 则返回一个代理对象
2, 调用 doCreateBean 方法
AbstractAutowireCapableBeanFactory#doCreateBean
在这个方法中调用了两个特别重要的方法 createBeanInstance 和 populateBean, 前者用于实例化 Bean, 后者用于初始化 Bean 实例
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
1, 如果指定了工厂方法的话, 则用指定的工厂方法实例化 Bean
2, 如果构造函数使用了自动装配的话, 则使用 autowireConstructor 实例化 Bean
3, 决定以使用带参数的构造方法实例化 Bean
4, 使用默认的构造方法实例化 Bean
补充:
1,autowire constructor
2, 用默认的构造方法实例化的时候涉及到实例化策略, 默认的策略是使用 cglib, 还有一种是使用反射
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
这一步所做的事情就是找到那些需要注入的属性和它所对应的实例, 然后将它设置到相应的属性上
还有一点是属性的类型可能有多种, 每一种的取值方式都不一样
参考
http://blog.csdn.net/hotdust/article/details/52613221
http://blog.csdn.net/lisongjia123/article/details/52134396
来源: https://www.cnblogs.com/cjsblog/p/8411097.html