话说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 依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁 ...
随机推荐
- Eclipse使用快捷键代码格式化有时失效解决办法
今天写代码的时候发现使用快捷键格式化代码没用了. 首先,先看看自己手动格式化是否还行 右键 - Source - Format 结果:正常! 既然手动正常的话那就可能是这个快捷键的热键被占用了,然后我 ...
- JS操作cookies方法
/** * 写入cookies */function setCookie(name, value) { var time = "1d"; //默认一天失效 var strsec = ...
- 关于背景图相对父容器垂直居中问题 —— vertical-align 和 line-height 之间的区别
html css <div class="register-wrapper"> <div class="register"> &l ...
- linux REDHAT6.4下安装ArcGIS Server 10.1
1 安装环境 因为Linux的发行版本比较多,我们在使用的时候请严格按照官网给的给出的版本,在官网上给出的是经过严格测试的,如果采用其他的,即便安装上了,在后续的运作中出现问题,这个可就麻烦了,官网对 ...
- Java字节数组转按radix进制输出
代码如下: public class Main_bytesToStr { public static void main(String[] args) throws IOException { // ...
- Fedora 24 Gnome Boxes 无法ping通网络
安装Fedora 24在试用虚拟机时发现无法ping通外网. 我傻傻地以为是软件问题. 问题描述: 尝试ping程序来测试网络连通性: (我之前也是ping百度,后来在为了少打字百度了一些比较短的域名 ...
- cURL函数
PHP的cURL函数是通过libcurl库与服务器使用各种类型的协议进行连接和通信的,curl目前支持HTTP GET .HTTP POST .HTTPS认证.FTP上传.HTTP基于表单的上传.co ...
- IBatis 2.x 和 MyBatis 3.0.x 的区别(从 iBatis 到 MyBatis)
从 iBatis 到 MyBatis,你准备好了吗? 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate.JPA 这样的一站式对象 / 关系 ...
- 【译文】 GC 安全点 和安全区域
原文链接 : here 根引用 Root references 一个实例死了,意味着它变得无用.只用程序员知道一个实例是否已经无用.为了让程序知道一个实例是否已经无用,我们可以使用编译器分析,引用 ...
- tyvj1004 滑雪
描述 trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形.为了得到更快的速度,滑行的路线必须向下倾斜. 例如样例中的那个矩形,可以从某 ...