转载

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

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

什么是 IoC

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

下面举个例子加深理解:

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

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

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

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 的作用域、生命周期,后面我会从源码的角度,分析讲解。

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

面试快被问烂的 Spring IoC,还不赶紧梳理一下
image.png
原文  https://juejin.im/post/5ddfd07af265da05d10c3266
正文到此结束
Loading...