刚毕业开始找工作时总是被问道这个问题,IOC(控制反转)和DI(依赖注入)是什么关系呢,能不能讲一讲IOC和DI,以前就认为面试官想聊聊spring bean的初始化过程,于是巴拉巴拉的讲了一通。但经过几年的工作和期间的不断学习才深刻理解了其中的含义。话不多说举一个场景:我们打工人每天朝九晚五,上班就要坐地铁、公交车、骑共享单车。当然有些土豪也是开车上班的。



此时我们就有三个类:Worker(打工人)、Transport(交通工具)、Bus(公交车)

此时有打工人迷迷糊糊睡到早上七点很不情愿地去上班,由于我们在代码里写死了只能坐公交车去。这样有一个很严重的问题:worker跟Transport是强耦合,如果想换成地铁或者自驾就得改代码了。有人会说Transport通过构造器传进去不就好了吗


确实是解决了强耦合问题,需要什么交通工具就用什么交通工具,看上去很完美

但如上再来一个打工人2也坐公交车呢,发现没有又构造了一个bus对象,这就是谁调用谁构造的弊端——bus不会是单例。这就会浪费很多的内存,这就是IOC(控制反转)解决的问题
spring IOC管理JVM进程中的bean工厂
通过把我们需要的对象都交给spring容器进行管理,当我们需要用到什么对象时再通过DI(依赖注入)向spring容器拿缓存好的bean。


当然也可以通过xml的bean标签方式,DI一般有三种方式:setter方法、构造器、注解。现在一般都是用注解方式。
总结:1. IOC实际就是把java程序需要用到的对象交给spring容器初始化并持有,而不是由调用者自己初始化
2.DI实际就是当调用者需要什么类的对象时向spring容器拿,而不用自己构造。调用者拿的方式主要有三种:setter方法、构造器、注解。
3.使用spring容器的好处:调用者和被调用者松耦合,并保持了对象的单例(这也是spring容器中的bean为什么默认是singleton的原因)

如若转载,请注明出处:https://www.shangmengchina.com/8003.html