我对 Spring IOC 的理解

刚开始学习 Spring 的时候,常常会搜索一些文章去尝试了解 IOC 这个概念。后来看多了,虽然大佬的博客解释的非常精彩,栗子也举得高高的。但是没亲自去探究,去专研,一直还是一知半解的。

首先,IOC 这是一种面向对象的设计原则,可以用来减低计算机代码之间的耦合度。

IOC 的解释为 Inversion of Control 控制翻转

这个名字一看是对初学者来说是有点懵逼的。但是掌握这个词对于理解这个概念,是非常有必要的。

想想我们刚开始学 Java 的时候,我们是这样的

图 1-1
图 1-1

通过 new 这个关键字来创建一个对象。你想想,这种创建行为其实就是我们主动发起的,也就是说创建对象的控制权在手里。

再回来看“控制翻转”这个词,换种说法来解释控制权调换了,已经不在我们这里了。

既然上面说控制权不在我们这里,那去哪里了?

主角登场了! 其实控制权交给了 Spring。交给 Spring 有啥好处?跟我们平时 new 一个对象有啥区别?

好处在于,不用我们亲自去 new 了。请看下图

图 1-2

图 1-2 中,代码解释是,通过传入资源文件 beans.xml(资源文件是描述需要注入的 bean 信息,包括 bean 在 容器中的标识、生命周期函数等),由 ClassPathXMLApplicationContext 负责定位,读取,加载 Bean 的信息进入 Spring 容器中。然后我们通过 Beanname 来到容器里面获取相应的 Bean。

说明一点是,Spring 容器是在 ApplicationContext 里面的。关于 Spring 容器和 Context 之间的关系以后有机会再讲,里面涉及到了一些其他的设计模式。

上面已经说完了代码的方式来实现使用 IOC。

那你可能有疑问,为什么这么麻烦!还要创建 xml 还要建立工厂,太麻烦了。还不如直接 new 一个来的直接,一行代码就可以满足了。

上面已经说了,IOC 是一种架构设计的思路,并不仅是为了减少代码量而生。直接 new 对象和注入对象两者的最终目的,都是为了获取自己想要的对象引用,从而执行相应的方法来完成逻辑。但问题在于,如果我们把获取引用的机会留给一个总部(相当于一个控制台),然后通过控制台,去控制整个项目的代码各个地方什么时候能获取到引用,什么时候执行,什么时候销毁等等,这就相当于简化、减少我们去思考一些问题,例如“什么时候创建对象”、“什么时候回收对象”,这就不会出现难以难以维护和调试的情况。同时,由IoC容器来管理对象的生命周期、依赖关系,从而是应用程序的配置和依赖规范与实际程序分开了。要是想修改啥参数,直接修改配置文件即可,代码完全不用动。

更爽的事情在于,在 Spring 容器中,我们拥有多种 Bean 的作用域,通过 Spring 容器我们可以随意根据需求选择。

## 关于注入的方式

让我说的话,控制翻转(IOC)是一种行为的描述。所以实现的策略也是有不同的。策略一是,依赖注入(Dependency Injection)、策略二是依赖查找(Dependency Lookup)。

根据百度的查找,我贴一下这两种策略的差别:

依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源。

依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)

一般在真实代码中,我们不会说直接像图 1-2 那样编码性从容器获取 Bean。在 Spring 中,选择实现的方式是依赖注入。而注入的方式有以下这几种:

  1. 接口注入
  2. Setter 注入:当 IOC 容器检测到需要某个属性,就会调用 setter 方法去将对象注入
  3. 构造器注入
  4. 注解注入:@Service @Reposity @Resource

## IOC 的实现基础是什么?

其实我知道很多人都明白,IOC 能够得到应用,很大程度上是因为 Java 拥有反射的特性。曾经测试过,反射的性能会比直接 new 一个对象慢很多。可以说,new 一个对象是 1ms,反射估计得 100ms 以上。这点还是感觉很浪费。但是我跟你说,这个结果可是经过不断优化后,才能达到效果。所以,使用反射的成本还不是很高的。

对于工程项目来说,反射会拖慢执行效率的时候估计是在项目启动的时候,会电脑的花销会很大。

猜你喜欢

转载自blog.csdn.net/T1014216852/article/details/81839917