在上面三篇文章中对依赖注入作了一个大体的梳理;里面都是大量代码的分析,本文在此基础上进行一个总结概括。post
如前几篇文章所述,依赖注入是由getBean来触发的;而后涉及到bean实例的建立、依赖关系的创建、属性注入等子过程。3d
固然,在获取到某个Bean的时候也会经过递归的方式来依赖注入依赖的beancode
createBeanInstance 生成了Bean所包含的Java对象,Spring中用SimpleInstantiationStrategy类来生成Bean对象的实例,实例化Java对象的方法有两种(CGlib是默认方式):cdn
populateBean 设置Bean对象的依赖关系对象
resolveValueIfNecessary 注入类型的处理;解析不一样类型的属性blog
setPropertyValues 属性注入递归
Ioc容器的初始化过程当中,主要的工做就是对BeanDefinition的定位、载入、解析和注册;可是就像以前说过的,此时依赖注入尚未发生。在Spring源码系列:依赖注入(一)getBean文中提到,依赖注入发生在应用第一次向容器获取Bean的时候;也就是上面说到的经过getBean来触发。get
固然,依赖注入也能够在容器初始化的过程当中就完成。这个就是lazy-init属性的存在乎义了。就是说咱们能够经过设置Bean的lazy-init属性来控制预实例化的过程。源码
预实例化:在初始化容器时完成Bean的依赖注入
it
这种作法的好处在于提升了咱们第一次获取Bean的的效率,可是它也下降了容器初始化的速度。(这个其实很好理解的,由于第一次获取Bean的时候,依赖注入已经完成了,直接拿过来用就行)
关于lazy-init属性的处理也是在wac.refresh这个方法中完成的,具体是在finishBeanFactoryInitialization方法中。若是继续追溯的话,最终是交给DefaultListableBeanFactory容器中的preInstantiateSingletons方法中完成。
lazy-init这种实例化方式就是经过将依赖注入委托给容器来处理,而不是在用户第一贯容器申请的Bean的时候完成依赖注入,不一样的阶段,也有不一样的优劣。