话说IOC(DI)
什么是IOC(DI)
书上的东东,因为说的太严谨,所以不太容易懂,其实也没那么复杂。
举几个例子:
1、文明点的:中午太热,不想出去吃饭,所以希望同事能帮忙带饭,现在有了点外卖平台,我们就可以直接在网上点,然后就有人送来了,然后就。。。
2、粗鲁点的:想嘿嘿嘿,自己找女朋友,还得哄她,还不能急,所以去鸡舍,然后就。。。。。
。。。。。
以上列子可以看出,其实IOC(DI)就是我们想做某件事,但是又要依赖另一个物体,并且另一个物体还是可变的(别告诉我,你就只有过一个女朋友),每次都需要我们亲自去处理,现在都有人帮我们做了,我们就只是告诉他我们需要的东西就行了,然后他会帮我们找到我们所需要的东西。
IOC(DI) 在代码中的实现
注:IOC(DI) 在代码中是针对接口和实现类的,如一个接口对应两个或两个以上的实现类。
“说起来简单做起来难”,现在就列出《Spring 3.x 企业应用开发实战》中IOC的Demo,主要参考的是电影《墨攻》,主演:刘德华;剧情:刘德华饰演的墨者革离到达梁国都城下,城上梁国守军问到“来者何人?”革离回答:“墨者革离!”
/**
* MoAttack:通过演员安排剧本
*/
public class MoAttack {
// 引用革离角色接口
private GeLi geLi = new LiuDeHua();
public void cityGateAsk() {
// 通过接口开展剧情
geLi.responseAsk("墨者革离");
}
}

由此可以看出,剧本需要革离这个角色,革离这个角色又可以有多个人来饰演,也就是说GeLi这个接口有多个实现类。每次都要写剧本的人去考虑演员,好像有点累,这本来就应该是导演的美差嘛。所以应该是以下这个结构:

导演选择剧本,剧本决定角色,导演来选择角色。
IOC的类型
从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。
构造函数注入
/**
* MoAttack:通过构造函数注入革离扮演者
*/
public class MoAttack {
// 引用革离角色接口
private GeLi geLi;
// 注入革离的具体扮演者
public MoAttack(GeLi geLi) {
this.geLi = geLi;
}
public void cityGateAsk() {
geLi.responseAsk("墨者革离");
}
}
导演角色也就是所说的容器
public class Director {
public void direct() {
// 指定角色的扮演者
GeLi geLi = new LiuDeHua();
// 注入扮演者到剧本中
MoAttack attack = new MoAttack(geLi);
attack.cityGateAsk();
}
}
属性注入
/**
* MoAttack:通过属性注入革离扮演者
*/
public class MoAttack {
// 引用革离角色接口
private GeLi geLi;
// 注入革离的具体扮演者
public void setGeLi (GeLi geLi) {
this.geLi = geLi;
}
public void cityGateAsk() {
geLi.responseAsk("墨者革离");
}
}
public class Director {
public void direct() {
// 指定角色的扮演者
GeLi geLi = new LiuDeHua();
// 注入扮演者到剧本中
MoAttack attack = new MoAttack();
attack.setGeLi(geLi);
attack.cityGateAsk();
}
}
接口注入
public interface ActorArrangable {
void injectGeLi(GeLi geLi);
}
/**
* MoAttack:通过接口方法注入革离扮演者
*/
public class MoAttack implements ActorArrangable {
// 引用革离角色接口
private GeLi geLi;
public void cityGateAsk() {
geLi.responseAsk("墨者革离");
}
@Override
public void injectGeLi(GeLi geLi) {
this.geLi = geLi;
}
}
public class Director {
public void direct() {
// 指定角色的扮演者
GeLi geLi = new LiuDeHua();
// 注入扮演者到剧本中
MoAttack attack = new MoAttack();
attack.injectGeLi(geLi);
attack.cityGateAsk();
}
}
话说IOC(DI)的更多相关文章
- 关于依赖注入IOC/DI的感想
之前一直不明白依赖注入有什么好处,甚至觉得它是鸡肋,现在想想,当时真是可笑. 这个想法正如同说接口是没有用处一样. 当整个项目非常庞大,各个方法之间的调用非常复杂,那么,可以想象一下,假设说没有任何的 ...
- Spring IOC/DI和AOP原理
一 IOC/DI 1. 概念机原理 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对 ...
- 深入理解IoC/DI
------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁 ...
- IoC/DI基本思想的演变
---------------------------------------------------------------------------------- (1)IoC/DI的概念 IoC ...
- 工厂方法模式与IoC/DI
IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 1:如何理解IoC/DI 要想理解上面两个概念,就必须搞清 ...
- spring 依赖注入(IOC DI)
依赖注入(IOC DI) 依赖注入的两种方式: 1. set注入 Spring要求使用set注入方式的时候,Bean需要提供一个无参数的构造方法.并提供一个属性的setter方法.例如: packag ...
- spring--学习之IOC DI
2.1.1 IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器 ...
- spring ioc DI 理解
下面是我从网上找来的一些大牛对spring ioc和DI的理解,希望也能让你对Spring ioc和DI的设计思想有更进一步的认识. 一.分享Iteye的开涛对Ioc的精彩讲解 Ioc—Inversi ...
- 工厂方法模式与IoC/DI控制反转和依赖注入
IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁 ...
随机推荐
- for循环嵌套执行效率
今天做项目时遇到一个for循环的嵌套问题,一个循环次数多,一个次数少,怎样设计效率较高. 想起以前笔试时遇到过这个问题,当时由于时间仓促,没有细想,今天在实际代码中遇到这么问题,于是动笔算了下. 设两 ...
- bzoj4726【POI2017】Sabota?
首先可以推出来如果i没有带头叛变,那么i的父亲也一定不会带头叛变,证明显然 所以最劣情况初始的叛徒肯定是叶子,并且带头叛变的人一定是从某个叶子往上走一条链 f[i]表示i不带头叛变的话最小的x 那么我 ...
- 正则表达式解析url参数
解析url参数正则:(?<=\?|&)[\w\={}\\\\,-:'\s'""]*(?=[^#\s]|) 意思是(?<=\?|&) 从?或&符号 ...
- 初识Jsoup之解析HTML
按照国际惯例,我首先应该介绍下Jsoup是个什么东西,然后在介绍下具体用法,然后在来个demo演示,其实我也是这么想的,小编今天花了一天的时间从学习—>解析页面,总算是成果圆满了吧,啊哈,但是, ...
- IE浏览器不能访问网页,google可以访问
现象:google浏览器可以进行网络访问,ie不能访问 原因:代理服务修改了局域网配置脚本 解决: Internet选项---连接---局域网设置: 去除勾选 “使用自动配置脚本”
- 【Alpha版本】冲刺随笔汇总
[Alpha版本]冲刺-Day1 [Alpha版本]冲刺-Day2 [Alpha版本]冲刺-Day3 [Alpha版本]冲刺-Day4 [Alpha版本]冲刺-Day5 [Alpha版本]冲刺-Day ...
- 关于linux asp.net MVC网站中 httpHandlers配置无效的处理方法
近期有Jexus用户反映,在Linux ASP.NET MVC网站的Web.config中添加 httpHandlers 配置用于处理自定义类型,但是在运行中并没有产生预期的效果,服务器返回了404( ...
- QT中将ASCII转换为对应数值的方法
有时候需要将一段ASCII转换为数值进行传输(比如串口) QString str=codeEdit->toPlainText(); QVector<uint>v=str.toUcs4 ...
- R入门<三>-R语言实战第4章基本数据管理摘要
入门书籍:R语言实战 进度:1-4章 摘要: 1)实用的包 forecast:用于做时间序列预测的,有auto.arima函数 RODBC:可以用来读取excel文件.但据说R对csv格式适应更加良好 ...
- 【荐】怎么用PHP发送HTTP请求(POST请求、GET请求)?
file_get_contents版本: <?php /** * 发送post请求 * @param string $url 请求地址 * @param array $post_data pos ...