在看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历史命令

    "忘记历史的Linux用户注定要输入很多信息.” 这也让强有力的历史命令(包括Bash shell的历史变体)不仅在援引之前执行命令而不需重新输入它们时有用,在调用其它很少用到的命令时也有用 ...

  2. CSS选择符——分门别类

    CSS选择符--分门别类 有时候,老是会对一些CSS选择器模模糊糊,傻傻分不清.今天花了点时间整理了一下,感觉世界清静了不少. 用XMIND做出了思维导图: 主要有11中选择器:元素.类ID.后代.子 ...

  3. java常见异常归纳

    1.java.lang.NullPointerException(空指针异常)    调用了未经初始化的对象或者是不存在的对象 经常出现在创建图片.调用数组这些操作中,比如图片未经初始化,或者图片创建 ...

  4. 去掉Chrome手机版首屏的“推荐的文章”

    百度可得很多类似的文章,然而都是失效的,,比如此文,本文演示所使用的Chrome版本为59. 百度所得的解决办法都是同一个,排版,截图都是一样的,害我浪费了不少力气. 第一,转载文章未标明文章出处: ...

  5. (转)解析json xml

    JSON数据 {"videos":[{"id":1,"image":"resources/images/minion_01.png ...

  6. jvm-监视管理控制台-jconsole

    命令: jconsole 作用: jvm进程运行状态的实时.可视化工具 效果: 连接远程jvm进程: 1.首先远程jvm进程,开启了jmx服务: -Dcom.sun.management.jmxrem ...

  7. Maven多模块项目新建技巧-解决公共项目install之后可以在单独模块中直接编译

    说明:如果按照这种方式http://www.cnblogs.com/EasonJim/p/8303878.html,且按照常规的install方式在子项目中编译项目,那么需要先install一下par ...

  8. SQLSERVER LATCH WINDBG

    https://mssqlwiki.com/2012/09/07/latch-timeout-and-sql-server-latch/

  9. centos 7.3systemctl工具

    http://www.cnblogs.com/tswcypy/p/4479153.html

  10. Oracle导入本属于sys用户的表

    FlashBack Database后,将删除的数据导出时使用了system用户 exp system/oracle file=/home/oracle/test.dmp tables=sys.tes ...