IOC设计模式-[摘录:CSDN]
1. IoC就是Inversion of Control——控制反转
在开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。
Ioc模式(Dependency Injection模式)有三种:
第一种类型 |
从JNDI或ServiceManager等获得被调用者,这里类似ServiceLocator模式。 |
1. EJB/J2EE 2. Avalon |
第二种类型 |
使用JavaBeans的setter方法 |
1. Spring Framework 2. WebWork/XWork |
第三种类型 |
在构造方法中实现依赖 |
1. PicoContainer, 2. HiveMind |
使用Ioc模式,可以不管将来具体实现,完全在一个抽象层次进行描述和技术架构,因此,Ioc模式可以为容器、框架之类的软件实现提供了具体的实现手段,属于架构技术中一种重要的模式应用。
2. IoC组件容器实现:
市场上已经提供很多优秀的容器。如EJB, COM+, CCM等,但由于大部分是“重量级”,在开发中代来大量的资源消耗和不便——因为它们是以资源换性能。为了开发的便利,本系统实现了一个简单的容器。本系统容器不是取代这些容器,相反,目标是使系统本身易于移植。
2.1 IoC容器的工作方式:
容器作为框架的基础技术,又被称作元框架。容器规定了组件必须遵循的规范(即组件的元数据),复杂以适当的技术创建、组装、管理组件的生命周期(可能是Singleton、缓存或者Pooling的方式),并将其交给使用者。
基本的技术可以为两个部分,如下:
A. 载入组件配置信息 :
载入XML配置文件并映射到组件信息对象。
B. 管理组件的行为和生命周期 :
实际上,容器要做的工作很多。容器在一个地址空间里运行好几个组件的实例,它处理了许多技术需求。为了确定这一切可以正常运作,容器要能对组件的行为作出假设。
容器载入组件并根据组件信息对象的提供的信息组装组件,并可能在销毁前反初始化。这个就是众所周知的生命周期管理。而且容器使用里高级的资源管理技术,如池调度和钝化技术。
典型的,在EJB的体系中回调接口如下 :
public void ejbCreate(); |
组件初始化工作。 |
public void ejbRemove(); |
组件反初始化工作。 |
public void ejbActivate(); |
组件从池化状态激活。 |
public void ejbPassivate(); |
组件钝化工作。 |
客户、组件和容器的协作关系如下图:
客户感觉每个实例始终是活跃的,然而在某个时刻内存中的真正实例总数可能大大低于逻辑活跃实例的数量。因而容器的工作负荷将大大减少。容器通常使用实例池调度和钝化来实现虚实例。这个结构对于组件开发者来说是不可见的。
总体而言,容器综合采用了cache、pool和virtual proxy三种关键技术来提高容器的工作性能。
C. 为组件提供上下文环境:
虽然我们一直强调松散耦合关系,然而组件还是不可避免的和其他组件或者资源(如数据库连接池)发生相互关系。由于组件本身不知道这些资源的位置,因而容器必须向组件提供一个上下文环境,使组件可以通过一个统一的入口访问到这些资源而无需关系这些资源的位置。
一个完整的容器架构看起来如下: