控制反转和容器(一)
IoC(Inversion of control,控制反转)是一个通用的设计原则,而DI(Dependency Injection,依赖注入)则是具体的设计模式,它充分体现了IoC的设计原则,是IoC的典型实现(非唯一实现),所以IoC和DI经常混用。Ioc是Spring框架的核心基础,不深入理解它也只能比葫芦画瓢地拷贝applicationContext.xml,做够了搬运工之后还是看看我们每次项目都在搬运的东西到底什么吧。本文不涉及Spring框架,就是研究控制反转和容器。
案例:开发一个这样的系统,功能之一是生成Bar Chart或Pie Chart不同类型的统计图,实现这个子系统。首先想到了JFreeChart,没错,它是一个非常好用的Java开源图形API,不过这里我们只研究一下控制反转。
分析:根据面向对象的设计思想,将系统分解成一组可重用的组件,“接口与实现分离”的原则很容易想到。创建出图形的通用接口,再进行具体的实现。我们得到如下代码。
(代码均省略包名和import语句)
public class ChartService {private ChartGenerator chartGenerator = ServiceLocator.getChartGenerator(); … … …}
服务定位器可以将查找逻辑从组件中分离出来,降低组件在查找方面的复杂性,增加了组件的重用性。但是这种方式依旧存在一个缺点:组件需要知道如何获取资源。那么要解决这个问题,控制反转的思想就要引入了,它是反转资源获取的方向。主动查找方式要求组件向容器发起请求来查找,最为回应,容器返回所需资源。而应用控制反转之后,则是容器主动地将资源送至它所管理的组件里,组件要做的就是选择一种合适的方式来接收资源。对于组件本身,这就是被动查找。
依赖注入是IoC的实现模式,主要有三种方案:setter方法注入,构造方法注入和接口注入。我们先看接口注入,接口注入要求组件必须实现容器定义的特定接口,容器正是通过这个接口注入依赖。
个人的一点体会,希望对学习者有用,也欢迎大家交流。(未完待续) 1 楼 qiren83 2010-06-01 不错 等下文 2 楼 sarin 2010-06-01 qiren83 写道不错 等下文
http://sarin.iteye.com/blog/593356