Spring源码系列——依赖注入(四)-总结

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Spring源码系列——依赖注入(四)-总结

  • Spring源码系列:依赖注入(一)getBean
  • Spring源码系列:依赖注入(二)createBean
  • Spring源码系列:依赖注入(三)-属性注入
  • 在上面三篇文章中对依赖注入做了一个大致的梳理;里面都是大量代码的分析,本文在此基础上进行一个总结归纳。

    依赖注入调用过程

    如前几篇文章所述,依赖注入是由getBean来触发的;然后涉及到bean实例的创建、依赖关系的建立、属性注入等子过程。

  • getBean 方法触发依赖注入
  • doGetBean 从容器中查找Bean(BeanFactory链,当前容器-双亲容器-双亲容器…)
  • 当然,在获取到某个Bean的时候也会通过递归的方式来依赖注入依赖的bean

  • createBeanInstance 生成了Bean所包含的Java对象,Spring中用SimpleInstantiationStrategy类来生成Bean对象的实例,实例化Java对象的方法有两种(CGlib是默认方式):
    • 通过BeanUtils,它使用了JVM的反射功能来生成Java对象实例
    • 用CGLIB来生成,CGLIB是一种常用的字节码生成器的类库
    • populateBean 设置Bean对象的依赖关系

      resolveValueIfNecessary 注入类型的处理;解析不同类型的属性

      setPropertyValues 属性注入

      关于lazy-init

      Ioc容器的初始化过程中,主要的工作就是对BeanDefinition的定位、载入、解析和注册;但是就像之前说过的,此时依赖注入还没有发生。在Spring源码系列:依赖注入(一)getBean文中提到,依赖注入发生在应用第一次向容器获取Bean的时候;也就是上面说到的通过getBean来触发。

      当然,依赖注入也可以在容器初始化的过程中就完成。这个就是lazy-init属性的存在意义了。就是说我们可以通过设置Bean的lazy-init属性来控制预实例化的过程。

      预实例化:在初始化容器时完成Bean的依赖注入

      这种做法的好处在于提高了我们第一次获取Bean的的效率,但是它也降低了容器初始化的速度。(这个其实很好理解的,因为第一次获取Bean的时候,依赖注入已经完成了,直接拿过来用就行)

      关于lazy-init属性的处理也是在wac.refresh这个方法中完成的,具体是在finishBeanFactoryInitialization方法中。如果继续追溯的话,最终是交给DefaultListableBeanFactory容器中的preInstantiateSingletons方法中完成。

      lazy-init这种实例化方式就是通过将依赖注入委托给容器来处理,而不是在用户第一向容器申请的Bean的时候完成依赖注入,不同的阶段,也有不同的优劣。

      原文始发于微信公众号(glmapper工作室):

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> Spring源码系列——依赖注入(四)-总结


     上一篇
    Spring源码系列——依赖注入(三)-属性注入 Spring源码系列——依赖注入(三)-属性注入
    前面文章中对依赖注入的触发和bean的创建做了学习记录,本文将来记录一下bean的属性注入过程。Bean的属性注入发生在 BeanDefinitionValueResolver这个类中, BeanDefinitionValueResolve
    2021-04-05
    下一篇 
    Spring源码系列——注解详解 Spring源码系列——注解详解
    因为要看Spring中注解的具体定义,所以在说之前,先来简单说下JAVA中注解的一些基本知识。 元注解什么是元注解呢,就是注解的注解。java中提供了以下几种: @Target 注解的作用域描述 public enum ElementTy
    2021-04-05