目录
3.2、IoC Service Provider如何管理对象间的依赖关系
1、IoC示意
IoC Service Provider在这里就是通常的Ioc容器所充当的角色。
2、Ioc注入方式
被注入的对象通过哪些方式来通知Ioc Service Provider为其提供服务呢?
1、构造方法注入
2、setter方法注入
3、接口注入
2.1、构造方法注入
构造方法注入,就是被注入对象可以通过在其构造方法中声明依赖对象的参数列表,让外部(通常是IoC容器)知道它需要哪些依赖对象。
2.2、setter方法注入
当前对象只要为其依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的依赖对象设置到被注入对象中。
setter方法注入虽不像构造方法注入那样,让对象构造完成后即可使用,但相对来说更宽松一些,可以在对象构造完成后在注入。
2.3、接口注入
被注入对象如果想要Ioc Service Provider为其注入对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入依赖对象。IoC Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象。
2.4、三种注入方式比较
- 接口注入:从注入方式上来说,接口注入是现在不甚提倡的一种方式。因为它强制被注入对象实现不必要的接口,带有侵入性。
- 构造方法注入:优点是,对象在构造完成后,即已进入就绪状态。可以马上使用。缺点是,当依赖对象比较多的时候,构造方法的参数列表会比较长。而通过反射构造对象的时候,对相同类型的参数的处理会比较困难。而且在Java中,构造方法无法被继承,无法设置默认值。对于非必须的依赖处理,可能需要引入多个构造方法,而参数数量的变动可能造成维护上的不便。
- setter方法注入:setter方法可以被继承,允许设置默认值,而且有良好的IDE支持。缺点是对象无法在构造完成后马上进入就绪状态。
2.5、总结
IoC是一种可以帮助我们解耦各业务对象间依赖关系的对象绑定方式。
3、IoC service Provider
3.1、IoC Service Provider的职责
- 业务对象的构建管理。在IoC场景中,业务对象无需关心所依赖的对象如何构架如何取得,但这部分工作始终需要有人来做。所以IoC Service Provider 需要将对象的构建逻辑从客户端对象那里剥离出来。以免这部分逻辑污染业务对象的实现。
- 业务对象间的依赖绑定。IoC Service Provider 通过结合之前构建和管理的所有业务对象,以及各个业务对象间可以识别的依赖管理,将这些对象所依赖的对象注入绑定,从而保证每个业务对象在视同的时候,可以处于就绪状态。
3.2、IoC Service Provider如何管理对象间的依赖关系
3.2.1、直接编码方式
在容器启动之前,我们可以通过程序编码方式将被注入对象和依赖对象注册到容器中,并明确它们相互之间的依赖注入关系。
3.2.2、配置文件方式
最为常见的,通过XML文件来管理和保存依赖注入信息。
3.2.3、元数据方式
下图,演示了使用Guice的相应注解标注后的FXNewsProvider定义。