Ioc的基本概念《Spring揭秘》第2章笔记
2015-08-26 21:43
417 查看
Ioc全程是Inversion of Control,控制反转,别名叫做依赖注入(DependencyInjection).
Ioc的宗旨:Don't call us,we will call you.
但是我们Spring为何要用Ioc,Ioc的作用是啥,有啥独特之处呢?
Ioc实际的作用就是解除对象之间的依赖关系,解除耦合关系。
没有使用Ioc模式时候,所有需要的对象都是由自己去直接创建实例使用,而是用了Ioc模式后需要取得对象的实例直接由Ioc Servcie Provider 来进行提供,解除了对象间的耦合关系。
有了这个Ioc Service Provide 提供服务,但是它怎么知道我需要的是什么对象呢?
有3种方式可以实现通知Ioc Service Provide 来进行提供服务
1.构造方法注入(constuctor injection)
构造方法注入可以通过在其构造方法中声明的依赖的参数列表,让外部(Ioc容器)知道它需要哪些依赖对象,比如一下的实例,只要声明以下的构造函数,即可支持构造方法注入。
public class ServiceImple{
private IDao1 dao1;
private IDao2 dao2;
public ServiceImple(IDao1 dao1,IDao2 dao2){
this.dao1 = newdao1;
this.dao2 = newdao2;
}
}
在ServiceImple构造函数中dao1,dao2就是可以通过构造方法注入。
同一个对象不同构造2次,因此被注入的对象的构造乃至整个生命周期都是有Ioc Service Provide 进行管理。当对象以构造方法注入完成后,就进入了就绪状态,可以直接是使用。缺点是:当依赖的对象过多时候,构造方法的参数列表会很长,而通过反射去构造对象时候,对相同的类型的参数处理会比较困难,维护和使用比较麻烦。而且java中构造方法无法被继承,无法设置默认值。对于非必须的依赖处理,可能需要引入多个构造方法,而参数的数量变动可能造成维护的不方便。
2. setter方法注入(setter injection)
对于JavaBean对象来说,通常会通过setXXX()和getXXX()来获取或者设置对应的属性,这些setXXX()方法统称为setter方法,getXXX()方法统称为getter方法,通过getter方法可以获取到相应的属性,setter可以更改相应的属性。若依赖的对象作为当前对象的属性,只需要为这个依赖的属性添加setter方法,就可以通过settter方法将相应的依赖对象设置到被注入的当前对象中,如下实例
public class ServiceImpl
{
[align=left] private IDao1 dao1;[/align]
[align=left] private IDao2 dao2;[/align]
public void setDao1(IDao1 dao1)
{
[align=left] this. dao1 = dao1;[/align]
[align=left] }[/align]
public void setDao2(IDao2 dao2)
{
[align=left] this. dao2 = dao2;[/align]
[align=left] } [/align]
[align=left] }[/align]
[align=left] 这样外界就可以通过调用setDao1,setDao2来为ServiceImpl对象注入所依赖的对象了。[/align]
[align=left] setter方法注入虽然不能像构造方法注入那样,让对象构造完成后可以立即使用,但是相对来说宽松一些,可以对象构造完成后在注入,好比去酒吧喝酒,我坐下来后可以自由的选择喝什么酒。[/align]
3.接口注入(interface injection)
接口的注入没有构造方法注入和setter注入简单明了。被注入的对象若是想要Ioc Service Provider 为其注入以来对象时,就必须去实现某一个接口。这个接口提供了一个方法,用来为其注入依赖对象。Ioc Service Provider 最终通过这些接口来了解应该为被注入的对象注入什么对象。
[align=left]如下实例演示了如何使用接口注入[/align]
[align=left] [/align]
[align=left] FXNewsProvider需要依赖IFXNewsListener,在这里是使用了接口注入的方式,FXNewsProvider实现了FXNewsListenerCallable接口,这个接口中声明了一个方法injectNewsListener(),该方法的参数就是所依赖的类型。这样InjectionServiceProvider就能通过这个接口的方法将对象注入到被注入的对象FXNewsProvider中去。[/align]
[align=left] 接口注入的方式比较死板以及繁琐,如果被注入的对象需要注入依赖对象,需要实现某一个接口。这种接口注入的方式很少用到,因为需要强制被注入对象实现特定的接口,带有侵入性。[/align]
[align=left] Ioc Service Provider 是一种可以帮助我们解耦业务对象之间依赖关系的对象绑定方式。[/align]
[align=left] [/align]
[align=left] [/align]
Ioc全程是Inversion of Control,控制反转,别名叫做依赖注入(DependencyInjection).
Ioc的宗旨:Don't call us,we will call you.
但是我们Spring为何要用Ioc,Ioc的作用是啥,有啥独特之处呢?
Ioc实际的作用就是解除对象之间的依赖关系,解除耦合关系。
没有使用Ioc模式时候,所有需要的对象都是由自己去直接创建实例使用,而是用了Ioc模式后需要取得对象的实例直接由Ioc Servcie Provider 来进行提供,解除了对象间的耦合关系。
有了这个Ioc Service Provide 提供服务,但是它怎么知道我需要的是什么对象呢?
有3种方式可以实现通知Ioc Service Provide 来进行提供服务
1.构造方法注入(constuctor injection)
构造方法注入可以通过在其构造方法中声明的依赖的参数列表,让外部(Ioc容器)知道它需要哪些依赖对象,比如一下的实例,只要声明以下的构造函数,即可支持构造方法注入。
public class ServiceImple{
private IDao1 dao1;
private IDao2 dao2;
public ServiceImple(IDao1 dao1,IDao2 dao2){
this.dao1 = newdao1;
this.dao2 = newdao2;
}
}
在ServiceImple构造函数中dao1,dao2就是可以通过构造方法注入。
同一个对象不同构造2次,因此被注入的对象的构造乃至整个生命周期都是有Ioc Service Provide 进行管理。当对象以构造方法注入完成后,就进入了就绪状态,可以直接是使用。缺点是:当依赖的对象过多时候,构造方法的参数列表会很长,而通过反射去构造对象时候,对相同的类型的参数处理会比较困难,维护和使用比较麻烦。而且java中构造方法无法被继承,无法设置默认值。对于非必须的依赖处理,可能需要引入多个构造方法,而参数的数量变动可能造成维护的不方便。
2. setter方法注入(setter injection)
对于JavaBean对象来说,通常会通过setXXX()和getXXX()来获取或者设置对应的属性,这些setXXX()方法统称为setter方法,getXXX()方法统称为getter方法,通过getter方法可以获取到相应的属性,setter可以更改相应的属性。若依赖的对象作为当前对象的属性,只需要为这个依赖的属性添加setter方法,就可以通过settter方法将相应的依赖对象设置到被注入的当前对象中,如下实例
public class ServiceImpl
{
[align=left] private IDao1 dao1;[/align]
[align=left] private IDao2 dao2;[/align]
public void setDao1(IDao1 dao1)
{
[align=left] this. dao1 = dao1;[/align]
[align=left] }[/align]
public void setDao2(IDao2 dao2)
{
[align=left] this. dao2 = dao2;[/align]
[align=left] } [/align]
[align=left] }[/align]
[align=left] 这样外界就可以通过调用setDao1,setDao2来为ServiceImpl对象注入所依赖的对象了。[/align]
[align=left] setter方法注入虽然不能像构造方法注入那样,让对象构造完成后可以立即使用,但是相对来说宽松一些,可以对象构造完成后在注入,好比去酒吧喝酒,我坐下来后可以自由的选择喝什么酒。[/align]
3.接口注入(interface injection)
接口的注入没有构造方法注入和setter注入简单明了。被注入的对象若是想要Ioc Service Provider 为其注入以来对象时,就必须去实现某一个接口。这个接口提供了一个方法,用来为其注入依赖对象。Ioc Service Provider 最终通过这些接口来了解应该为被注入的对象注入什么对象。
[align=left]如下实例演示了如何使用接口注入[/align]
[align=left] [/align]
[align=left] FXNewsProvider需要依赖IFXNewsListener,在这里是使用了接口注入的方式,FXNewsProvider实现了FXNewsListenerCallable接口,这个接口中声明了一个方法injectNewsListener(),该方法的参数就是所依赖的类型。这样InjectionServiceProvider就能通过这个接口的方法将对象注入到被注入的对象FXNewsProvider中去。[/align]
[align=left] 接口注入的方式比较死板以及繁琐,如果被注入的对象需要注入依赖对象,需要实现某一个接口。这种接口注入的方式很少用到,因为需要强制被注入对象实现特定的接口,带有侵入性。[/align]
[align=left] Ioc Service Provider 是一种可以帮助我们解耦业务对象之间依赖关系的对象绑定方式。[/align]
[align=left] [/align]
[align=left] [/align]
相关文章推荐
- 每日五题(java基础)
- MyEclipse下实现git克隆代码到本地
- 最全的Spring面试题和答案
- Java之Comparable接口和Comparator接口
- 【JavaSE】day04_Collection_Iterator_新循环_泛型
- Sqlite_操作数据库_JDBC连接Java与数据库
- Java多线程 -- volatile关键字
- Java高手需要注意的25个学习目标
- Highcharts+Spring饼图使用实例
- Java多线程 -- 死锁
- eclipse 查找jar包内的class文件 快捷键
- java日期操作
- JAVA问题总结之14-程序运行时间的测量
- 2016阿里在线笔试Java研发附加题
- Java之iterator迭代器和iterable接口
- javascirpt对象创建
- JavaSE基础整理1-基本概念
- 将数组元素循环右移k个位置(Java实现)
- Spring Data Jpa配置
- Spring笔记②--各种属性注入