IOC容器的初始化后,在容器中就建立BeanDefinition数据映射。依赖注入常见有两种时机,一个是在用户第一次向IoC容器getBean时触发,另外一个是在初始化容器时会将non-lazy-init的单例Bean预先实例化,内部也是调用getBean。
getBean()方法,在IOC容器的顶层接口BeanFactory中定义,然后在IOC容器的具体实现类DefaultListableBeanFactory类的基类AbstractBeanFactory实现了getBean()方法。
Bean的生命周期
Bean 的生命周期概括起来就是实例化 -> 属性赋值 -> 初始化 -> 销毁 4 个阶段:
Bean的扩展点
在Bean初始化过程中Aware接口依赖注入,有几个重要的可能被Bean实现的接口:
在Bean实例化与初始化过程的前期与后期分别有扩展的接口:
Bean生命周期中的扩展点接口处理有:
容器调用的Bean自身的扩展方法:
Bean的存放位置
Spring的IOC容器初始化完成后,BeanDefinition对象保存到BeanFactory的实例变量的beanDefinitionMap与beanDefinitionNames集合中(这个对象在DefaultListableBeanFactory中),注:解决BeanDefinition属性继承(bean标签的parent属性)最后都使用合并mergedBeanDefinitions容器。
完成Bean的初始化之后,不同作用域的Bean实例存放不同位置。
Spring托管的Bean基本上都是singleton作用域的Bean实例,为了缓存或者解决循环依赖,涉及到的几个存放位置有:
Spring查找Bean的顺序是singletonObjects -> earlySingletonObjects -> singletonFactories。
Bean 作用域
Spring 中为 Bean 定义了5种作用域, 分别为 :
依赖注入方式
对于spring配置一个bean时,如果需要给该bean提供一些初始化参数依赖注入,则需要通过依赖注入方式,常见三种方式:构造器注入、setter 方法注入、成员变量注入,另外还有工厂方法注入。。
Spring提供了五种autowire自动装配模式: