1.控制反转(Inversion
of Control)与依赖注入(Dependency
Injection)

控制反转即IoC (Inversion of Control)。它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。

所谓的“控制反转”概念就是对组件对象控制权的转移。从程序代码本身转移到了外部容器。

IoC是一个非常大的概念,能够用不同的方式来实现。

其主要实现方式有两种:<1>依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这样的方式。

<2>依赖注入(Dependency Injection):组件不做定位查询,仅仅提供普通的Java方法让容器去决定依赖关系。后者是时下最流行的IoC类型,其又有接口注入(Interface Injection),设值注入(Setter
Injection)和构造子注入(Constructor Injection)三种方式。

图1 控制反转概念结构

依赖注入之所以更流行是由于它是一种更可取的方式:让容器全权负责依赖查询。受管组件仅仅须要暴露JavaBean的setter方法或者带參数的构造子或者接口,使容器能够在初始化时组装对象的依赖关系。其与依赖查找方式相比。主要优势为:<1>查找定位操作与应用代码全然无关。<2>不依赖于容器的API,能够非常easy地在不论什么容器以外使用应用对象。<3>不须要特殊的接口,绝大多数对象能够做到全然不必依赖容器。

 

2.好莱坞原则

IoC体现了好莱坞原则,即“不要打电话过来,我们会打给你”。第一次遇到好莱坞原则是在了解模板方法(Template Mathod)模式的时候。模板方法模式的核心是,基类(抽象类)定义了算法的骨架。而将一些步骤延迟到子类中。

如今来考虑IoC的实现机制,组件定义了整个流程框架,而当中的一些业务逻辑的实现要借助于其它业务对象的增加,它们能够通过两种方式參与到业务流程中,一种是依赖查找(Dependency
Lookup),类似与JDNI的实现,通过JNDI来找到对应的业务对象(代码1),还有一种是依赖注入,通过IoC容器将业务对象注入到组件中。

3.
依赖查找(Dependency Lookup)


以下代码展示了基于JNDI实现的依赖查找机制。

public class MyBusniessObject{
private DataSource ds;
private MyCollaborator myCollaborator; public MyBusnissObject(){
Context ctx = null;
try{
ctx = new InitialContext();
ds = (DataSource) ctx.lookup(“java:comp/env/dataSourceName”);
myCollaborator =
(MyCollaborator) ctx.lookup(“java:comp/env/myCollaboratorName”);
}……

依赖查找的主要问题是。这段代码必须依赖于JNDI环境,所以它不能在应用server之外执行,而且假设要用别的方式代替JNDI来查找资源和协作对象,就必须把JNDI代码抽出来重构到一个策略方法中去。

4.
依赖注入(Dependency Injection)


依赖注入的基本原则是:应用组件不应该负责查找资源或者其它依赖的协作对象。

配置对象的工作应该由IoC容器负责,“查找资源”的逻辑应该从应用组件的代码中抽取出来。交给IoC容器负责。

以下分别演示3中注入机制。

代码2 待注入的业务对象Content.java

package com.zj.ioc.di;

public class Content {

    public void BusniessContent(){
System.out.println("do business");
} public void AnotherBusniessContent(){
System.out.println("do another business");
}
}

MyBusniess类展示了一个业务组件。它的实现须要对象Content的注入。

代码3。代码4。代码5。6分别演示构造子注入(Constructor Injection),设值注入(Setter Injection)和接口注入(Interface Injection)三种方式。

代码3构造子注入(Constructor Injection)MyBusiness.java

package com.zj.ioc.di.ctor;
import com.zj.ioc.di.Content; public class MyBusiness {
private Content myContent; public MyBusiness(Content content) {
myContent = content;
} public void doBusiness(){
myContent.BusniessContent();
} public void doAnotherBusiness(){
myContent.AnotherBusniessContent();
}
}

代码4设值注入(Setter
Injection) MyBusiness.java

package com.zj.ioc.di.set;
import com.zj.ioc.di.Content; public class MyBusiness {
private Content myContent; public void setContent(Content content) {
myContent = content;
} public void doBusiness(){
myContent.BusniessContent();
} public void doAnotherBusiness(){
myContent.AnotherBusniessContent();
}
}

代码5 设置注入接口InContent.java

package com.zj.ioc.di.iface;
import com.zj.ioc.di.Content; public interface InContent {
void createContent(Content content);
}

代码6接口注入(Interface
Injection)MyBusiness.java

package com.zj.ioc.di.iface;
import com.zj.ioc.di.Content; public class MyBusiness implements InContent{
private Content myContent; public void createContent(Content content) {
myContent = content;
} public void doBusniess(){
myContent.BusniessContent();
} public void doAnotherBusniess(){
myContent.AnotherBusniessContent();
}
}

以上是学习spring的最主要的概念的理解。仅仅是对理解spring迈出了一小步。真正的理解,要放在实践中去。

Spring入门--控制反转(IOC)与依赖注入(DI)的更多相关文章

  1. iOS控制反转(IoC)与依赖注入(DI)的实现

    背景 最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能.Java语言自带的注解特性为IoC和DI带来了极大 ...

  2. 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。

    轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战   ...

  3. 控制反转IOC与依赖注入DI

    理解 IOC  http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html IOC 相关实例      的http:// ...

  4. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...

  5. Spring框架学习笔记(1)——控制反转IOC与依赖注入DI

    Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...

  6. 控制反转IOC与依赖注入DI【转】

    转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...

  7. 【转载】浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

    原文地址 http://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...

  8. 控制反转IOC与依赖注入DI - 理论篇

    学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现 ...

  9. 依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

    原文: https://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...

随机推荐

  1. Java中二进制字节与十六进制互转

    在Java中字节与十六进制的相互转换主要思想有两点: 1.二进制字节转十六进制时,将字节高位与0xF0做"&"操作,然后再左移4位,得到字节高位的十六进制A;将字节低位与0 ...

  2. 概率编程语言(Probabilistic Programming Languages)库 —— edward

    注意:tensorflow api 在 1.1.0 以后迎来重大变化,edward 的稳定版依赖于 tensorflow 1.1.0. edward是一个支持概率建模.推断的 Python 第三方库, ...

  3. Linux下CD/DVD刻录软件

    1.Brasero是一款CD/DVD刻录软件,Gnome桌面环境默认自带,支持单次写入数据DVD和任何类型的CD,并且能够将光盘镜像写入到硬盘,其图形化的操作界面使用户能够轻松而快速的在Linux下烧 ...

  4. Vuejs2.0构建一个彩票查询WebAPP(3)

    整个工程的目录及截图如下,源码下载    使用心得: 1.了解Vue的生命周期很有必要,详情参见博文Vue2.0 探索之路——生命周期和钩子函数的一些理解 2.Vuex全局状态管理真是美味不可言 st ...

  5. Java main方法中的String[] args

    -- Java 命令行参数 -- 关于其中的args以及public static / static public Java 命令行参数 前面已经看到多个使用Java数组的示例,每一个Java应用程序 ...

  6. react-native signatures do not match the previously installed version;

    原因:手机上已经安装过打包后的apk应用,与真机调试无法共存. 解决办法:删除手机上已经安装过的apk应用.

  7. BZOJ2636: crisis(可持久化线段树)

    传送门: 解题思路: 题目描述是一大坑点,cancel后面是直接加ask或者redo的. 那么就可以愉快地可持久化了. 注意需要支持区间修改,那么就只需要在再次更新这个点的时候将标记储存在新的儿子中. ...

  8. mysql 中sql 语句查询今天、昨天、近7天、近30天、一个月内、上一月数据

    ·1.几个小时内的数据 DATE_SUB(NOW(), INTERVAL 5 HOUR) 1 ·2.今天 select * from 表名 where to_days(时间字段名) = to_days ...

  9. CentOS桥接网卡配置

    网桥方式配置步骤 1.增加网桥设备br0 vi /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 ONBOOT=yes TYPE=Bridge B ...

  10. stat---显示文件的状态信息

    stat命令用于显示文件的状态信息.stat命令的输出信息比ls命令的输出信息要更详细. 语法 stat(选项)(参数) 选项 -L:支持符号连接: -f:显示文件系统状态而非文件状态: -t:以简洁 ...