IOC(Inversion of Control,控制反转)和 DI(Dependency Injection,依赖注入)是同一个概念。
传统模式中,如果一个 Java 实例(调用者)需要另一个 Java 实例(被调用者) ,需要调用者去创建被吊用着实例的。
而在 Spring 中,是由 Spring 容器去创建被调用者实例,这是控制反转,将对象的控制权(主要是查找和创建对象的权利)交由 Spring 容器;当调用者需要使用被调用者实例时,由 Spring 容器来将对应的实例注入给调用者,这就是依赖注入,应用程序依赖 Spring 容器注入对象需要的外部资源。
这种思想其实也体现在人类社会的发展中,例如:当一个人需要一把斧子。
- 在没有专门生产菜刀的人员出现之前,只能是自己去制作一把斧子,需要了解斧子完整的制作过程。对应 Java 的传统模式。
- 专门生产斧子的工厂出现了之后,需要斧子的人就可以到工厂购买斧子,并不需要知道斧子是如何制作的。对应简单工厂模式。
- 出现了快递业务之后,需要斧子的人只需要下一个订单购买斧子,就会由工厂制作出斧子,然后快递小哥就会将其送到这个人面前。对应 Spring 依赖注入。
第一种情况下,Java实例的调用者创建被调用的Java实例,必然要求被调用的Java类出现在调用者的代码里。无法实现二者之间的松耦合。
第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用。此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者需要自己定位工厂,调用者与特定工厂耦合在一起。
第三种情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,系统自动提供被调用者实例。事实上,调用者和被调用者都处于Spring的管理下,二者之间的依赖关系由Spring提供。
原文链接:https://blog.csdn.net/zhupengqq1/article/details/104306929