近来,在java社群里越来越多的提及的一个词汇就是轻量级容器,这些容器能够帮助开发者将来自不同项目的组件组装成为一个内聚的应用程序。在这些轻量级容器的的背后有一个共同的模式,这个模式决定了这些组件进行装配的方式——那就是控制反转(Inversion of
Control,IoC)。
控制反转的作用和目的就是应该将组件的配置与使用分离开,使其更具条理化,容易适应变化的环境,或者称为解耦合。
组件与服务
所谓“组件”是指这样一个软件单元:它将被作者无法控制的其他应用程序使用,但后者不能对组件进行修改。也就是说,使用一个组件的应用程序不能修改组件的源代码,但可以通过作者预留的某种途径对其进行扩展,以改变组件的行为。
服务和组件有某种相似之处:它们都将被外部的应用程序使用。在我看来,两者之间最大的差异在于:组件是在本地使用的(例如JAR 文件、程序集、DLL、或者源码导入);而服务是要通过——同步或异步的——远程接口来远程使用的(例如web service、消息系统、RPC,或者socket)。
这些轻量级容器则使用了更为灵活的办法,只要插件遵循一定的规则,一个独立的组装模块就能够将插件的具体实现“注射”到应用程序中,这种方法也就被称为依赖注入!
Dependency Injection 模式的基本思想是:用一个单独的对象(装配器)来获得MovieFinder的一个合适的实现,并将其实例赋MovieLister 类的一个字段。
依赖注入的形式有三种:分别将它们叫做构造子注入(Constructor Injection)、设值方法注入(Setter Injection)和接口注入(Interface Injection)。这三种注入形式分别就是type 1 IoC(接口注入)、type 2 IoC(设值方法注入)和type 3 IoC(构造子注入)