构造方法注入(constructor injection)
构造方法中声明依赖对象的参数列表,让IoC容器知道它需要哪些依赖对象。
此方法比较直观,对象构造完成后,即进入就绪状态,可以马上使用。
public FXNewsProvider(IFXNewsListener newsListner,IFXNewsPersister newsPersister)
{
this.newsListener = newsListner;
this.newPersistener = newsPersister;
}
setter 方法注入(setter injection)
只需要为依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的依赖对象设置到被注入对象中。
比构造方法注入宽松一些,可以在对象构造完成后再注入。
public class FXNewsProvider
{
private IFXNewsListener newsListener;
private IFXNewsPersister newPersistener;
public IFXNewsListener getNewsListener() {
return newsListener;
}
public void setNewsListener(IFXNewsListener newsListener) {
this.newsListener = newsListener;
}
public IFXNewsPersister getNewPersistener() {
return newPersistener;
}
public void setNewPersistener(IFXNewsPersister newPersistener) {
this.newPersistener = newPersistener;
}
}
接口注入(interface injection)
被注入对象如果想要IoC Service Provider为其注入依赖对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入依赖对象。IoC Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象。
接口注入比较死板和繁琐,是现在不甚提倡的一种方式,“退役”选手。
三种方式比较
注入方法 | 优缺点 |
---|---|
构造方法注入 | 构造方法注入的优点是当对象构造完成之后,就能够处于就绪状态,能够提供使用,而缺点在于如果对象太多,或者某个对象的参数多而复杂的话,构造方法就很繁琐,并且维护也是有较大的困难 |
setter方法注入 | 主要体现在性能方面,因为方法可以自定义命名,描述也就更加人性化了,可以有默认值设置。不足的地方可能就是不能立即使用该对象 |
接口注入 | 入侵性太强,如果需要注入依赖对象,被注入对象必须声明和实现另外的接口。不提倡这种方法 |