程序员

Spring IoC实现原理(附思维导图)

2020-10-29  本文已影响0人  ChinaXieShuai

本文适合初学者,也适合老手巩固以前的知识,针对IOC的知识点进行详细的讲解。

在刚开始接触IOC的时候,很多初学者回听到很多名词 IOC、DI、Spring IOC 等,往往听的一头雾水。所以在学习之前我们先梳理下这些概念,之后再去深入学习 IoC 的实现原理部分。

很多人都知道 IOC,都知道 IOC 是 Spring 容器的内核。

AOP、申明式事务等功能在此基础上开发的。甚至在一提到 IOC 这个概念的时候就很自然的想到 Spring 容器,并将它们混为一谈,认为 IoC 就是 Spring IoC。这样理解虽然并不妨碍我们使用 Spring 框架,但是两者却不是一回事。

IOC的概念和思想

IOC (Inversion Of Control 译为 反转控制),顾名思义,其一是控制,其二是反转。即某一个接口具体实现类的选择控制权从调用类中移除,转交给第三方决定,在 Spring 容器中是由 Bean 配置来进行控制的。

这段话比较绕口,简单来说就是有了 IoC 之后你需要什么对象,IoC 容器帮你解决,你在家等着,IoC 容器主动送货上门。没有 IoC 之前是自己亲手去创建管理对象,现在直接现成的送过来。

再回头看看,IoC 的 控制 和 反转 这个两个名词就很好理解了:

再未使用 IoC 之前,需要使用一个对象需要直接 new 一个。那么你所依赖的对象就需要你自己去控制。但是有了 IoC 之后,直接由 IoC 容器来控制依赖的对象,当你依赖一个对象的时候就由 IoC 容器创建后注入到被注入的对象中。

而实现 IOC 概念的容器除了 Spring 还有 Guice,Jboss 等。

所以 IOC 和 Spring 中的 IOC 不能混为一谈。可以说,IOC 本身只是一种概念和设计思想,Spring 容器实现了 IOC 思想,是 IOC 的实践。

但由于 IOC 这种命名确实不够开门见山,因此业界曾进行了广泛的讨论,最终软件界的泰斗级人物 Martin Fowler 提出了 DI(Dependency Injection,依赖注入)的概念用来替代 IoC。即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除掉用类对某一接口实现类的依赖。

可以看出 DI 依赖注入的解释 比 IoC 反转控制 更直接明了,初学者更容易理解。

很多人将 IoC 和 DI 混为一谈,这样虽然也不影响使用,但至少要知道它由 IoC 变为 DI 的发展过程。

Spring IoC 的原理

Spring IoC 的底层实现是基于反射技术,不了解这块知识的同学可以看下这两篇文章学习一下:《反射一开,谁都不爱》《工厂模式的三种实现,就这么简单!》

前面说了 IoC 容器是一个大的工厂来管理所有对象和它们的依赖关系,Spring 再处理这些对象和依赖关系也很简单:

那 Spring 究竟是如何知道哪些对象是需要管理的呢?如何进行管理的呢?又是如何进行注入的呢?

Spring 通过一个配置文件或注解来描述 Bean 和 Bean 之间的依赖关系,根据 Bean 配置信息在容器内部创建Bean定义注册表,根据注册表加载、实例化 Bean、建立Bean与Bean之间的依赖关系,还提供了 Bean 实例缓存、生命周期管理、Bean 实例代理、事件发布、资源装载等高级服务。

Spring 框架和核心接口是 Bean 工厂,工厂分为两种:

BeanFactory 有着庞大的继承、实现体系,有众多的子接口、实现类。

来看一下 BeanFactory 的基本类体系:

BeanFactory 的基本类体系

ApplicationContext 的继承体系:

ApplicationContext 的继承体系

介绍了 Bean 的工厂类,再来详细的解答下 Spring 是如何管理这些类的?这个问题。

Bean的生命周期

Bean 的生命周期可以说是面试的时候常问的问题之一,我们可以用下面两张图直观的感受下:

BeanFactory 中 Bean 的生命周期:

BeanFactory 中 Bean 的生命周期

ApplicationContext 中 Bean 的生命周期:

ApplicationContext 中 Bean 的生命周期

可以看到在进行实例化、设置属性值、通过 init-method 属性配置的初始化方法、放入 Spring 缓冲池 前后都有方法可以对 Bean 进行再次加工。

Bean 的生命周期从开始到最终销毁其中经历的方法可以分为四类:

Bean 的装配过程

简单叙述下 Bean 的装配过程:

ApplicationContext 和 BeanFactory 的区别

区别:

Bean的装配方式

Bean 的装配方式有四种:

一般都是用 xml 和 注解 两种配置,其他的方式使用的不多。这里不多做叙述

依赖注入的方式

依赖注入的方式有三种方式:

这其中属性注入的方式比较常用。

对象之间关系

对象之间有三种关系:

Bean的作用域

默认Bean的作用域是单例的,其他需要使用不同类型的作用域,需要单独配置。

这里有个知识点 @lookup注解需要注意。如果我们需要在 singleton 的 Bean 中注入一个 prototype 的 Bean 并希望在每次调用 singleton 的 Bean 的时候获取的都是 prototype 的 Bean ?这就需要使用 @lookup注解。

IOC 的优缺点

总结

这里,再次做一个知识点的总结:

最后再附上Spring-Ioc的思维导图,建议点赞、关注、收藏,以便随时复习巩固知识:

Spring-Ioc的思维导图

我是帅帅,一个在互联网苟且偷生的工具人。

上一篇 下一篇

猜你喜欢

热点阅读