第 2 章 IoC 的基本概念
2.1 我们的理念是:让别人为你服务
public class FXNewsProvider {
private IFXNewsListener newsListener;
private IFXNewsPersister newPersistener;
public void getAndPersistNews() {
String[] newsIds = newsListener.getAvailableNewsIds();
if (ArrayUtils.isEmpty(newsIds)) {
return;
}
for (String newsId : newsIds) {
// 抓取新闻内容
FXNewsBean newsBean = newsListener.getNewsByPK(newsId);
// 存储抓取的新闻
newPersistener.persistNews(newsBean);
newsListener.postProcessIfNecessary(newsId);
}
}
}
通常情况下,被注入对象会直接依赖于被依赖对象。但是,在 IoC 场景中,二者之间通过 IoC Service Provider 来打交道,所有的被注入的对象和依赖对象现在由 IoC Service Provider 统一管理。
2.2 手语,呼喊,还是心有灵犀
2.2.1 构造方法注入
构造方法注入(constructor injection)就是被注入对象可以通过在其构造方法中声明依赖对象的参数列表,让外部(通常是 IoC 容器)知道它需要哪些依赖对象。
构造方法注入方式比较直观,对象被构造完成后,即进入就绪状态,可以马上使用。
2.2.2 setter 方法注入
setter 方法注入是指当前对象为其依赖对象所对应的属性添加 setter 方法,就可以通过 setter 方法将相应的依赖对象象设置到被注入对象中。
setter 方法注入方式相对宽松,可以在对象构造完成后再注入。
2.2.3 接口注入
接口注入(interface injection)是指被注入对象如果想要 IoC Service Provider 为其注入依赖对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入依赖对象。IoC Service Provider 最终通过这些接口来了解应该为被注入对象注入什么依赖对象。
接口注入方式死板且烦琐。
2.2.4 三种注入方式的比较
- 接口注入:不提倡,基本退役。
- 构造方法注入:优点是构造完成即可使用;缺点是参数列表可能过长、通过反射构造对象时,相同类型的参数会难以处理、Java 中构造方法无法被继承,无法设置默认值、可能需要引入多个构造方法。
- setter 方法注入:优点是可以被继承,允许默认值;缺点是构造完成后无法立即就往就绪状态。
2.3 IoC的附加值
解耦各业务对象间依赖关系的对象绑定方式。
FXNewsProvider dowJonesNewsProvider = new FXNewsProvider(new DowJonesNewsListener(),new DowJonesNewsPersister());
FXNewsProvider marketWin24NewsProvider = new FXNewsProvider(new MarketWin24NewsListener(),new DowJonesNewsPersister());
2.4 小结
略