IOC 和 DI

   IOC(Inversion of Control,控制反转)和 DI(Dependency Injection,依赖注入)是同一个概念。

  传统模式中,如果一个 Java 实例(调用者)需要另一个 Java 实例(被调用者) ,需要调用者去创建被吊用着实例的。

  而在 Spring 中,是由 Spring 容器去创建被调用者实例,这是控制反转,将对象的控制权(主要是查找和创建对象的权利)交由 Spring 容器;当调用者需要使用被调用者实例时,由 Spring 容器来将对应的实例注入给调用者,这就是依赖注入,应用程序依赖 Spring 容器注入对象需要的外部资源。

  这种思想其实也体现在人类社会的发展中,例如:当一个人需要一把斧子。

  1. 在没有专门生产菜刀的人员出现之前,只能是自己去制作一把斧子,需要了解斧子完整的制作过程。对应 Java 的传统模式。
  2. 专门生产斧子的工厂出现了之后,需要斧子的人就可以到工厂购买斧子,并不需要知道斧子是如何制作的。对应简单工厂模式。
  3. 出现了快递业务之后,需要斧子的人只需要下一个订单购买斧子,就会由工厂制作出斧子,然后快递小哥就会将其送到这个人面前。对应 Spring 依赖注入。

  第一种情况下,Java实例的调用者创建被调用的Java实例,必然要求被调用的Java类出现在调用者的代码里。无法实现二者之间的松耦合。

  第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用。此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者需要自己定位工厂,调用者与特定工厂耦合在一起。

  第三种情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,系统自动提供被调用者实例。事实上,调用者和被调用者都处于Spring的管理下,二者之间的依赖关系由Spring提供。

  原文链接:https://blog.csdn.net/zhupengqq1/article/details/104306929

猜你喜欢

转载自blog.csdn.net/qq_40395874/article/details/114341434