面试快被问烂的 Spring IoC,还不赶忙梳理一下

IoC 是 Inverse of Control 的缩写,翻译过来叫作控制反转,它不是什么技术,而是一种设计思想。面试

什么是 IoC

在传统的 Java 程序中,咱们都是在对象内部经过 new 主动进行对象建立的;而 IoC 是专门有一个容器来建立这些对象,当程序须要这些对象的时候,不须要显式地使用 new 建立,而是由 IoC 容器完成对象的注入。spring

下面举个例子加深理解:数组

古时候皇帝想宠幸某个妃子,就会直接说,今天选熹妃,后面的事情就交给太监办了;皇帝晚上回宫时,熹妃天然会出如今龙床上。app

整个后宫就是 Spring 容器,妃子就是 Spring 控制下的 JavaBean ,从选妃到入宫再到废除,这是 JavaBean 的生命周期,太监宫女就是 BeanFactory ,而侍寝的整个过程就是控制反转,皇帝不须要知道妃子父母是谁(构造函数是什么样的),何时入的宫(何时初始化),只须要说须要熹妃仍是华妃就能够了。函数

*这样说是否是就容易理解了,固然面试的时候千万别这样讲。spa

IoC 的优缺点

  • 由于采用了依赖注入,在初始化的过程当中,避免写大量的 new ,并且这样也就不须要了解其中的细节,好比不须要搞清楚每一个 Bean 构造函数的参数;
  • IoC 实现组件之间的解耦,提升程序的灵活性和可维护性。一样的,IoC 让建立对象的步骤变复杂了,由于用反射来建立对象,因此在效率上会有些损耗;
  • 不过相比“解耦”的做用,这点儿损耗也显得微不足道了。

Spring IoC 加载过程

再简单地总结一下 Spring IoC 加载的所有过程,大体可分为定位、解析、注册、实例化四个步骤:翻译

  • 定位:就是资源文件定位,资源文件能够是文件、URL、二进制数组,和Bean配置有关的一般是 XML / @Configuration / 注解(Java文件);通常是在 ApplicationContext 的实现类里完成的,能够将外部的资源,读取为 Resource 类。
  • 解析:解析就只对资源文件的解析;解析主要是在 BeanDefinitionReader 中完成的;好比最多见的 XML 配置文件,那么将解析工做委托给 XmlBeanDefinitionReader 来完成;解析最终解析的结果都封装为 BeanDefinitionHolder ;
  • 注册:所谓的注册,其实就是将 BeanDefinition 的 Name 和实例,保存到一个 Map 中;bean 的注册是在 BeanFactory 里完成的;BeanFactory 接口最多见的一个实现类是 DefaultListableBeanFactory ,其中的 Map 就是 BeanDefinitionMap ,是一个 ConcurrentHashMap 。
  • 实例化:注册完成后,在 BeanFactory 的 getBean() 方法之中,完成初始化;这时候应用程序就能够直接使用 Bean 了。

固然,关于 Spring IoC 还有不少细节须要了解,好比 Bean 的做用域、生命周期,后面我会从源码的角度,分析讲解。设计

会点代码的大叔 | 文【原创】orm


image.png
image.png
相关文章
相关标签/搜索