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期讲课的时候接触到了,不断的积累,查找资料,深入学习,总结,多多的听老师的课,思想有很大的提升影响着自己的思维方式、做事方式,影响着、蜕变着……

SSH深度历险(五) 深入浅出-----IOC AND AOP的更多相关文章

  1. SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP

    AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP之所以能得到广泛应用,主要是因为它将应用系统拆分分了2个部分 ...

  2. SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)

    接上一篇 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的CGLB代理方式 Security ...

  3. SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式

    这对时间在学习SSH中Spring架构,Spring的事务配置做了详细总结,在此之间对Spring的事务配置只是停留在听说的阶段,总结一下,整体把控,通过这次的学习发觉Spring的事务配置只要把思路 ...

  4. SSH深度历险(一)深入浅出Hibernate架构(一)-------映射解析——七种映射关系

            ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据 ...

  5. SSH深度历险(七) 剖析SSH核心原理(一)

    接触SSH有一段时间了,但是对于其原理,之前说不出来莫模模糊糊(不能使用自己的语言描述出来的就是没有掌握),在视频和GXPT学习,主要是实现了代码,一些原理性的内容还是欠缺的,这几天我自己也一直在反问 ...

  6. SSH深度历险(九) Struts2+DWZ+Uploadify实现多文件(文件和图片等等)上传

    在gxpt_uas系统中,要实现文件(文件和图片等等,可以灵活配置)的批量上传至mongodb,在学习这个过程中,学习了mongodb,并实现了批量上传的功能,实现思路:在DWZ的基础上参考官方的实例 ...

  7. SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式

           在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依 ...

  8. SSH深度历险(三) EJB Session Bean有状态和无状态的差别与联系

    刚開始对两种sessionbean存在误解.觉得有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用.而觉得无状态是每次调用实例化一次,不保留用户信息.细致分析并用实践检验后,会发现,事实 ...

  9. SSH深度历险(四) Maven初步学习

    这几天接触这个词,很多遍了,只是浅显的体会到它在GXPT中的好处,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理 ...

随机推荐

  1. xx学院学员评优评奖管理系统

    [勤拂拭软件,软件开发,毕业设计,程序作业,论文写作指导:q-[1215714557]  加好友请注明:勤拂拭)] 之前帮助一个军校学生做的一个评优评奖管理系统,该系统主要用于学校学生评优评先使用. ...

  2. centos7 支持中文显示

    http://www.linuxidc.com/Linux/2017-07/145572.htm这篇文章比较全.我印证了一下,没有问题 centos7的与centos6有少许不同: 1.安装中文包: ...

  3. 读书笔记-《Maven实战》-关于Maven依赖传递的思考 2018/4/26

    上次读书笔记中,提到了依赖传递.看着依赖传递表,一直在思考为什么会是这样. 先看传递表: compile test provided runtime compile test provided run ...

  4. Java编写高质量代码改善程序的151个建议

    第一章  Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混淆的字母: (i.l.1:o.0等). 建议2:莫让常量蜕变成变量: (代码运行工程中不要改变常量值). 建议3:三元操作符 ...

  5. UMAIL安装教程

    UMAIL安装教程 一.UMAIL虚拟机的创建与安装 首先在VM中选择新建虚拟机 选择下一步 选择稍后安装操作系统 选择Linux系统 版本CentOS 7 64位 选择名称与安装位置 选择下一步 选 ...

  6. Android TextView常用属性

    [说明] TextView是用来显示文本的组件.以下介绍的是XML代码中的属性,在java代码中同样可通过 "组件名.setXXX()方法设置.如,tv.setTextColor(); [属 ...

  7. 反射 类的加载 Schema DOM 解析方式和解析器 命名空间

    Day15 反射 1.1 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. l 加载 就是指将class文件读入内存,并为之创建 ...

  8. Git 中 SSH key 生成步骤

    由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以必须要让github仓库认证你SSH key,在此之前,必须要生成SSH key. 第1步:创建SSH Key.在windows下 ...

  9. js 利用 ajax 加载 js ,显示加载进度 ,严格按照js的顺序先后加载到页面

    js 利用 ajax 加载 js ,显示加载进度 ,严格按照js的顺序先后加载到页面 , 做手机端开发时,发现一个问题,有些浏览器,在网速比较慢的情况下,js文件没有加载完,后续的调用已经开始调用了, ...

  10. Java面试06|项目相关介绍

    1.明确你的项目到底是做什么的,有哪些功能 广告投放机:项目主要是为移动端有针对性的进行广告展示. 媒体管理平台SSP:为媒体端实现多种变现途径 (1)广告投放机中关于广告检索与排序的功能 1.广告检 ...