IOC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统(容器)来控制实现,而不是在你的类内部控制。这称为控制反转。
本人理解:就是把原本你自己制造,使用的对象,现在交由别人制造,而通过构造函数(容器来管理),setter方法或方法(这里指使用这个对象的方法)参数的方式传给自己,由自己使用。
实例说明形象理解IOC
要设计一个Girl和一个Boy类,其中Girl有recognize方法,即Girl想要recognize一个Boy。那么,我们的问题是,Girl如何能够认识这个Boy?
常见的MM与GG的认识方式有以下几种
1 青梅竹马; 2 亲友介绍; 3 父母包办 那么哪一种才是最好呢?
青梅竹马:Girl从小就知道自己的Boy。
<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">代码: public class Girl { void recognize(){ Boy boy = new Boy(); } } </span></span></span></span>
然而从开始就创建的Boy缺点就是无法在更换。并且要负责Boy的整个生命周期。如果Girl想要换一个怎么办?
不足:第1种是通过接口注射,这种方式要求我们的类必须实现容器给定的一个接口,然后容器会利用这个接口给我们这个类注射它所依赖的类。
亲友介绍:由中间人负责提供Boy来见面
<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">代码: public class Girl { void recognize(){ Boy boy = BoyFactory.createBoy(); } } 亲友介绍,固然是好。如果不满意,尽管另外换一个好了。但是,亲友BoyFactory经常是以Singleton的形式出现,不然就是,存在于 Globals,无处不在,无处不能。实在是太繁琐了一点,不够灵活。我为什么一定要这个亲友掺和进来呢?为什么一定要付给她介绍费呢?等等?</span></span></span></span>
父母包办:一切交给父母,自己不用费吹灰之力,只需要等着recognize就好了。
<span style="font-size:18px;"><span style="font-family:Microsoft YaHei;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">代码: public class Girl { void recognize(Boy boy){ // <span style="font-family:Microsoft YaHei;">recognize</span> boy boy.<span style="font-family:Microsoft YaHei;">recognize</span>(); } }</span></span></span></span></span>
Well,这是对Girl最好的方法,只要想办法贿赂了Girl的父母,并把Boy交给他。那么我们就可以轻松的和Girl来recognize。这就是IOC,将对象的创建和获取提取到外部。由外部容器提供需要的组件。
我们知道好莱坞原则:“Do not call us, we will call you.” 意思就是,You, girlie, do not call the boy. We will feed you a boy。
很简单 ,就是本来你该做的事情 你不去做了 让系统去做,比如,你获取一个对象的时候,往往需要new出实例来,如果用了控制反转,那这件事情 就不需要你做了,你只需要在配置文件xml中配置好,系统就帮你new,控制反转也叫依赖注入,就是把该用到的东西 提前注入进去,下次直接用 而不是每次都new
IoC,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
实例USB接口例子
笔记本电脑与外围存储设备通过预先指定的一个接口(USB)相连,对于笔记本而言, 只是将用户指定的数据发送到USB接口,而这些数据何去何从,则由当前接入的USB设备决定。在USB 设备加载之前,笔记本不可能预料用户将在USB接口上接入何种设备,只有USB设备接入之后,这种设 备之间的依赖关系才开始形成。
对应上面关于依赖注入机制的描述,在运行时(系统开机,USB 设备加载)由容器(运行在笔记本 中Windows操作系统)将依赖关系(笔记本依赖USB设备进行数据存取)注入到组件中(Windows 文件访问组件)。
个人理解:
传统模式中是类和类之间直接调用,所以有很强的耦合度,程序之间的依赖关系比较强,后期维护时牵扯的比较多。
IOC,用配置文件(XML)来描述类与类之间的关系,由容器来管理,降低了程序间的耦合度,程序的修改可以通过简单的配置文件修改来实现
面向切面编程AOP
Aspect Oriented Programming(面向切面编程),可以 通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一 添加功能的一种技术(再实例学习)。
总结
这些概念首次接触,是老师给8期讲课的时候接触到了,不断的积累,查找资料,深入学习,总结,多多的听老师的课,思想有很大的提升影响着自己的思维方式、做事方式,影响着、蜕变着……