在看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. linux ssh 登录服务器失败,密码明明没错【解决】

    本来这样登录的: $ ssh 123.123.123.123 //ssh + IP 然后输入密码就是登录不了,显示permision denied 后来使用如下方式登录,成功! $ ssh -v us ...

  2. 静态页面表单中js验证

    笔记: 1. onblur事件:onblur 事件会在对象失去焦点时发生.http://www.w3school.com.cn/jsref/event_onblur.asp onkeyup事件:onk ...

  3. (17)python 网络编程

    TCP连接的断点是由一个IP地址和一个端口号来唯一标识的 客户端/服务器 客户端总是最开始申请连接的一端,服务器则是等待客户端连接的一段 服务器的端口号如果不是特殊用土的一般应该大于1024,客户端则 ...

  4. CF 1003C Intense Heat【前缀和/精度/双层暴力枚举】

    The heat during the last few days has been really intense. Scientists from all over the Berland stud ...

  5. 使用 Hibernate 完成 HibernateUtils 类 (适用于单独使用Hibernate或Struts+Hibernate)

    package com.istc.Utilities; import org.hibernate.Session; import org.hibernate.SessionFactory; impor ...

  6. ActiveMQ学习总结

    一.消息中间件的产生的背景 1.在网络通讯中,Http请求默认采用同步请求方式,基于请求与响应模式 2.在客户端与服务器进行通讯时,客户端调用服务端接口后,必须等待服务端完成处理后返回结果给客户端才能 ...

  7. NOIP2018提高组模拟题(五)

    字符串(string) Description 小林与亮亮正在做一个游戏.小林随意地写出一个字符串,字符串只由大写 字母组成,然后指定一个非负整数 m,亮亮可以进行至多 m 次操作,每次操作 为交换相 ...

  8. CodeForces 348C Subset Sums(分块)(nsqrtn)

    C. Subset Sums time limit per test 3 seconds memory limit per test 256 megabytes input standard inpu ...

  9. 2、Flask实战第2天:URL传参

    当我们访问网站/的时候,会执行hell_world函数,并把这个函数的返回值返回给浏览器,这样浏览器就显示hello world了 @app.route('/') def hello_world(): ...

  10. 深入理解Session和Cookie机制

    具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而 ...