链接: https://www.cnblogs.com/xdp-gacl/p/4249939.html.
以上的链接很好的解释了IOC和DI关系和作用,深入浅出的解释了两者的含义,便于初学者加深对IOC这种设计思想以及对DI这种关系的的理解。以下是便于个人复习和理解整理,若有理解不当或者侧重掌握角度不同的地方还请认真打开上述链接;
IOC
IOC(控制翻转) 不是什么技术,而是一种设计思想
●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
DI
●谁依赖于谁:当然是应用程序依赖于IoC容器;
●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
传统的控制 是指你(程序)创建了一个属性类 如:用户类(user) 和用户信息类(userInfo);你(程序)需要手动的创建(new)这两个类把 userInfo放入user里面实现依赖关系(这里理解成user依赖userInfo类,因为信息类离开user类是完整的表达,但是user类离开userInfo类就表达不全) 是你(程序)控制了对象之间的关系;
而控制翻转则是IOC这种容器控制了他们之间的关系,我们制定这种关系(通过)由他们管理这种关系,而且
【new和配置bean的区别】
1、Spring实现了对象池,一些对象创建和使用完毕之后不会被销毁,放进对象池(某种集合)以备下次使用,下次再需要这个对象,不new,直接从池里取,节省时间
2、使用new关键字创建的对象属于强引用对象,所谓强引用,就是jvm垃圾回收机制永远不会回收这类对象,这时候需要手动移除引用。如果没有移除,这个对象将一直存在,久而久之,会引起内存泄露问题。
**IoC和DI由什么关系呢?**其实它们是同一个概念的不同角度描述,(IOC 可以理解为获取角色主动权的改变,是一种思想转变,而DI则是解释这种思想中的一种作用)由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
IOC相当于婚介所,程序是个待婚男士,他需要找对象的话需要,正常来说是自己找,现在把要就交给IOC容器,让他帮忙找需要的对象,很nice。