在看ico概念之前,先想一下我们平常需要依赖某个类时会怎么做?

无非是在要用到的地方写如下代码:

Person person = new Person();
//然后就可以用person对象来获取Person类提供的服务了
person.say("hellow Ioc!");

先不说这样做有什么不好,想一下我们的目的只是想调用person的说话服务而已,每次调用前都需要自己创建个person对象这样是否真的有必要?答案当然是no。

在上面的例子中,被注入对象直接依赖于被依赖对象(先理清这两个名词),但实际上被注入对象并不需要关心被依赖对象具体是谁?什么时候被创建?它只需要在要用到被依赖对象的时候,被依赖对象能准备好为它服务。要实现这种模式就需要第三个对象介入,被依赖对象不需要关心的都交给它去做,这就是ioc模式。

这张图很好地说明了ioc的工作模式,那么问题又来了,Ioc Service Provider(ioc服务提供者)怎么知道被注入对象需要哪些被依赖对象呢?Ioc Service Provider要服务很多被注入对象,如果让它一个个去问:您需要什么对象呢?这样会把它搞糊涂或者忙不过来,所以需要被注入对象去通知它。那么,怎么通知呢?

ioc模式里用到3种方式:

1.构造方法注入

public Team(Person person){
this.person = person;
}

Ioc Service Provider会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。同一个对象是不可能被注入两次的,因此,被注入对象的构造乃至整个生命周期应该是由Ioc Service Provider来管理的。构造方法注入方式比较直观,对象完成构造后,它所依赖的对象也已经注入完成,随时可以使用。

2.setter方法注入

private Person person;
public Person getPerson(){
return person;
}
public void setPerson(Person person){
this.person = person;
}

这样Ioc Service Provider就可以在适当的时候通过调用setPerson方法为当前对象注入所依赖的person对象了。跟构造方法的不同在于这个注入过程是发生在被注入对象构造完成之后一个不确定的时间里,不过我们并不关心在什么时候注入。

3.接口注入

接口注入比较麻烦,被注入对象如果想要Ioc Service Provider为其注入依赖对象,就必须实现某个接口,这个接口提供一个方法用来为其注入对象,现在已经没有ioc框架在用了,这里就不再详细说明。

比较一下三种注入方式:

后边一节Ioc的附加值看完之后理解了但是觉得作者举得例子并不好,之前在网上看到一个例子感觉说到了精髓,有兴趣的可以看看:http://www.cnblogs.com/cyq1162/archive/2013/06/06/3120231.html

总结:

本章主要介绍了Ioc模式解决了什么问题,以便更好第理解ioc的概念,然后又列出并对比了三种注入方式的区别。

spring揭秘读书笔记----ioc的基本概念的更多相关文章

  1. spring揭秘 读书笔记 一 IoC初探

    本文是王福强所著<<spring揭秘>>一书的读书笔记 ioc的基本概念 一个例子 我们看下面这个类,getAndPersistNews方法干了四件事 1 通过newsList ...

  2. spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...

  3. spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,并且IoC Service Pr ...

  4. Spring揭秘 读书笔记 三 bean的scope与FactoryBean

    本书可作为王富强所著<<Spring揭秘>>一书的读书笔记  第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...

  5. Spring揭秘读书笔记 八 数据访问异常体系

    这篇博客 来自spring揭秘一书的第十三章 为什么要有访问异常都有一个体系,这个我们得从DAO模式说起. DAO模式 任何一个系统,不管是一个最简单的小系统,还是大规模的系统,都得跟数据打交道,说白 ...

  6. spring揭秘读书笔记----spring的ioc容器之BeanFactory

    spring的ioc容器是一种特殊的Ioc Service Provider(ioc服务提供者),如果把普通的ioc容器认为是工厂模式(其实很相似),那spring的ioc容器只是让这个工厂的功能更强 ...

  7. spring揭秘 读书笔记 六 bean的一生

    我们知道,Spring容器具有对象的BeanDefinition来保存该对象实例化时需要的数据. 对象通过container.getBean()方法是才会初始化该对象. BeanFactory 我们知 ...

  8. Spring揭秘 读书笔记 五 容器的启动

    Spring的IoC容器所起的作用,就是生产bean,并维持bean间的依赖关系.它会以某种方式加载Configuration Metadata(通常也就是XML格式的配置信息),然后根据这些信息绑定 ...

  9. Spring揭秘 读书笔记 七 BeanFactory的启动分析

    首先,先看我自己画的BeanFactory启动时的时序图. 第一次接触时序图,可能有些地方画的不是很符合时序图的规则,大家只关注调用顺序即可. public static void main(Stri ...

随机推荐

  1. python 执行顺序

    从上往下顺序执行,定义的方法和类要写在调用之前, 如果有 if __name__ == '__main__'   改方法所在的文件作为启动文件时会被调用,如果作为模块被调用时不会被执行.

  2. hdu6127

    hdu6127 题意 二维平面上存在一些点,每个点都有权值,任意两点组成的线段的权值为这两点权值的乘积,选定一条经过原点的直线,问怎样使得它经过的线段的权值之和最大. 分析 题目等价于用一条直线将平面 ...

  3. 洛谷——P1375 小猫

    P1375 小猫 题目描述 有2n只小猫站成一圈,主人小明想把它们两两之间用绳子绑住尾巴连在一起.同时小明是个完美主义者,不容许看到有两根绳子交叉.请问小明有几种连线方案,可以把让所有小猫两两配对? ...

  4. 【C++】const 常引用的用法

    用法: const int & a; 定义了一个整型常引用变量a. 特点: 1.不能够通过常引用变量来修改其值,如: const int & a = 10; a = 12;//编译报错 ...

  5. 选择快速源来加速linux系统更新

    sudo pacman-mirrors -c China -g 引用自manjaro百度贴吧

  6. 学习python网站

    http://code.ziqiangxuetang.com/python/python-dictionary.html

  7. Problem B: 调用函数,求1!+2!+3!+......+10!

    #include<stdio.h> double fact(int i); int main() { int i; ; ;i<=;i++) sum=sum+fact(i); prin ...

  8. Douglas Peucker算法的C#实现

    一.算法原理 Douglas-Peucker算法 在数字化过程中,需要对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度 上保持原有的形状. 经典的Douglas-Peucke ...

  9. SQLServer组成:

    SQL Server DB Engine (Relational Engine),SQL语言用于向Engine描述问题. Algebrizer:代数器,检查语法,并将查询转换成内部表达式 Query ...

  10. GIS空间参考及坐标转换

    空间参考(Spatial Reference)是 GIS 数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确的坐标. 在同一个地图上显示的地图数据的空间参考必须是一致的,如果两 ...