spring揭秘读书笔记----ioc的基本概念
在看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的基本概念的更多相关文章
- spring揭秘 读书笔记 一 IoC初探
本文是王福强所著<<spring揭秘>>一书的读书笔记 ioc的基本概念 一个例子 我们看下面这个类,getAndPersistNews方法干了四件事 1 通过newsList ...
- spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定
本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...
- spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定
本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,并且IoC Service Pr ...
- Spring揭秘 读书笔记 三 bean的scope与FactoryBean
本书可作为王富强所著<<Spring揭秘>>一书的读书笔记 第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...
- Spring揭秘读书笔记 八 数据访问异常体系
这篇博客 来自spring揭秘一书的第十三章 为什么要有访问异常都有一个体系,这个我们得从DAO模式说起. DAO模式 任何一个系统,不管是一个最简单的小系统,还是大规模的系统,都得跟数据打交道,说白 ...
- spring揭秘读书笔记----spring的ioc容器之BeanFactory
spring的ioc容器是一种特殊的Ioc Service Provider(ioc服务提供者),如果把普通的ioc容器认为是工厂模式(其实很相似),那spring的ioc容器只是让这个工厂的功能更强 ...
- spring揭秘 读书笔记 六 bean的一生
我们知道,Spring容器具有对象的BeanDefinition来保存该对象实例化时需要的数据. 对象通过container.getBean()方法是才会初始化该对象. BeanFactory 我们知 ...
- Spring揭秘 读书笔记 五 容器的启动
Spring的IoC容器所起的作用,就是生产bean,并维持bean间的依赖关系.它会以某种方式加载Configuration Metadata(通常也就是XML格式的配置信息),然后根据这些信息绑定 ...
- Spring揭秘 读书笔记 七 BeanFactory的启动分析
首先,先看我自己画的BeanFactory启动时的时序图. 第一次接触时序图,可能有些地方画的不是很符合时序图的规则,大家只关注调用顺序即可. public static void main(Stri ...
随机推荐
- js跳转整理(简记)
location.replace(URL)跳转脱离历史记录流: location.href=url;在历史记录中 子刷新父级 parent.location.replace(parent.locati ...
- Scala 实现快速排序和归并排序
def quickSort1(array: Array[Int]): Array[Int] = { def swap(x: Int, y: Int): Unit = { val tmp = array ...
- Annotation的语法和使用
http://blog.csdn.net/cdl2008sky/article/details/6265742 (1) .<context:component-scan base-package ...
- java.lang.NoSuchMethodError:org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session
项目配置了spring 4.0.6.RELEASE 和hibernate4.2.0.Final ,出错原因是因为在Spring 3.1开始没有了HibernateDaoSupport类,而我的却Dao ...
- 【贪心】Gym - 100507H - Pair: normal and paranormal
每次取相邻的两个可以射击的从序列中删除,重复n次. 可以看作括号序列的匹配. #include<cstdio> #include<vector> using namespace ...
- Linux中安装MySql 5.7.21的详细操作步骤
一:到mysql官网下载最新的mysql包 mysql-5.7.21-linux-glibc2.12-x86_64 官方下载地址:https://dev.mysql.com/downloads/mys ...
- Orcale自增/Hibernate 配置
-- 自增 create sequence SEQ_T_APP_USER start with 1 increment by 1; -- 触发器 create trigger DECTUSER_T_ ...
- [Bug]CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temp
win7中安装asp.net的问题 编译器错误信息: CS0016: 未能写入输出文件问题解决办法 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地 ...
- jQuery用noConflict代替$
js框架很多的情况下,很容易出现冲突,建议使用noConflict代替$ //消除$对jquery缩写 $.noConflict(); //使用了noConflict后,用$就会无效,应用jQuery ...
- easyUI中datagrid控制获取指定行数的数据
直接上代码: var rows=$('#detail').datagrid('getRows');//获取所有当前加载的数据行 var row=rows[0];// 行数从 0 开始 项目中代码: v ...