23中设计模式----实现spring 的IOC(简单工厂+单例+懒加载)

简介

Spring IOC 是 Spring 的框架的核心部分,所谓 IOC ,就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系,它将Bean的控制和创建权全部归于 Spring 的 IOC 容器,使得开发更加简单优雅,获取 Bean 更加方便。那么Spring IOC 是如何实现的呢,我们有怎么实现 的 IOC 呢?本章将带您实现一个简单的 IOC ,如果您已经读过我前面写的 《

23种设计模式之------单例模式(不同应用场景下的实现方案)》 和 《23种设计模式之------工厂模式(工厂与简单工厂将如何选择?)》,将更有助于您理解这篇文章

本章将一下几个部分组成

  • Spring IOC 容器Bean加载原理
  • 我将如何重新实现IOC
  • 实现IOC实例

Spring IOC 容器Bean加载原理

Spring 中 Bean 的 加载包含以下步骤

  1. Bean的定义与注册

还记得吗?我们每次 使用 Spring IOC 容器管理 Bean 时,都会先 定义好一个接口(比 如Service)和接口的实现类(比如ServiceImpl),然后通过注释(比如@Service)的方式或者直接在XML中引入的方式注册Bean。这其实就是Bean 的定义与注册,只有这样,Spring IOC 容器才可以管理我们的 Bean,

2、Bean的加载

Spring提供了一个BeanFactory的接口,这个接口的主要功能就是创建并加载Bean

3、将已加载的 Bean 放入 IOC 容器

Spring提供一个ApplicationContext的容器,用于存入所有已加载的 Bean,使用的时候直接获取

4、获取Bean

Spring 的 BeanFactory 接口 提供一个 getBean 方法,这个方法就是对外提供的获取Bean的方法,Spring IOC 默认使用的是懒加载的方法,本章也将以懒加载的方式实现 IOC 功能

23中设计模式----实现spring 的IOC(简单工厂+单例+懒加载)

spring框架

我将如何重新实现IOC

正如上面Spring的加载原理所说,我将按照上面步骤,自己实现一个 Spring IOC.

实现IOC实例

定义一个需要IOC容器加载的接口以及接口的实现类,如下

23中设计模式----实现spring 的IOC(简单工厂+单例+懒加载)

定义接口CarService

23中设计模式----实现spring 的IOC(简单工厂+单例+懒加载)

然后注册service,Spring 中 Bean 的注册方式有多种,主要是 通过注解和xml中配置文件的方式,在这里,为了方便起见,我直接创建一个用户注册的注册器 BeanRegisterContant ,并将 CarServiceImpl注入进去,如下

23中设计模式----实现spring 的IOC(简单工厂+单例+懒加载)

用于注册Bean

下面,创建一个工厂类的顶级接口BeanFactory,并实现它,用于创建和管理Bean,真正管理Bean 的其实是它的实现类
ConstantApplicationContext,如下

23中设计模式----实现spring 的IOC(简单工厂+单例+懒加载)

创建Bean的顶级接口

23中设计模式----实现spring 的IOC(简单工厂+单例+懒加载)

用于管理所有的Bean

好了,到此为止,所有准备工作已经完成,Spring IOC 的雏形已经出了了,当然真正的 Spring IOC 要比这个复杂,但是,原理是一样的,下面看看测试代码

23中设计模式----实现spring 的IOC(简单工厂+单例+懒加载)

在测试代码中,首先创建一个 ConstanApplicationContext (这其实相当于Spring中的加载器
ClassPathXmlApplicationContext,都是用于加载和Bean的)。然后调用 getBean()方法,根据名称获取Bean,当然,你也可以根据Class获取,实现都是一样的,测试结果如下

我是一辆车,我正在高速公路上行驶。。。。。。

自此,整个过程完成。

总结

有些东西看起来非常困难,其实原理就是这么简单,只是实现比较复杂。当然真正的 Spring IOC 的实现比这个复杂,要考虑的东西也比较多,但是基本原理是一样的,我这个是简化版的 IOC,但是对理解 Spring IOC 会有帮助,在此基础上,去看 Spring ioc 的源码,也会更容易理解

创作不易,转载请声明,如有问题、意见或建议,请在下方的评论区留言!


分享到:


相關文章: