<script type="text/javascript"> document.location.href="http://blog.csdn.net/mindhawk/archive/2006/12/16/1445000.aspx"; </script> 配置扩展点是HiveMind的一个核心概念。当你拥有一系列服务之后,对这些服务进行配置就是很自然的了。在HiveMind里,一个配置扩展点包含了一个无序元素的集合。其中的每个元素都是定义在某个模块里,另外每个模块都可以为一个对它可见的扩展点增加定义元素(HiveMind里面把这种定义称为contribution)。
服务扩展点(service point)和配置扩展点(configuration point)没有直接的联系,所以服务和配置同名也是很常见的(这种同名可能是有意的或无意的;服务和配置扩展点使用的是不同的命名空间)。服务和配置扩展点的联系只有在代码里面才能体现,服务关联了一个配置之后就可以随意操作它里面的所有元素。
现在,HiveMind里的配置扩展点可以是配置的数据是一个不可修改的List或一个不可修改的Map。区别这两种模式的方法是通过指定关键属性来区别,如果指定关键属性则会使用这个属性最为主键。
在系统启动的时候配置扩展点的数据是不会生成的,在第一次引用配置扩展点的数据(List或Map)时才会生成一个实际数据的代理。生成的代理结构和 单例模式的代理模式很像,也分为内外两层。当实际访问时内层代理会改变外层代理的内层代理属性,使其指向实际的数据。和单例模式不同的是,配置扩展点生成的代理不是动态代码生成的,而是一个已经编写好的类。不动态生成的原因可能是因为此处的代理只需要涉及List和Map两种固定的类型,不需要根据运行时的情况动态的获取类类型并为其生成代理。下图展示了代理的类结构。
下面以List的size方法为例,通过连续两次访问该方法解释代理如何实现延迟读取的过程。
服务扩展点(service point)和配置扩展点(configuration point)没有直接的联系,所以服务和配置同名也是很常见的(这种同名可能是有意的或无意的;服务和配置扩展点使用的是不同的命名空间)。服务和配置扩展点的联系只有在代码里面才能体现,服务关联了一个配置之后就可以随意操作它里面的所有元素。
现在,HiveMind里的配置扩展点可以是配置的数据是一个不可修改的List或一个不可修改的Map。区别这两种模式的方法是通过指定关键属性来区别,如果指定关键属性则会使用这个属性最为主键。
在系统启动的时候配置扩展点的数据是不会生成的,在第一次引用配置扩展点的数据(List或Map)时才会生成一个实际数据的代理。生成的代理结构和 单例模式的代理模式很像,也分为内外两层。当实际访问时内层代理会改变外层代理的内层代理属性,使其指向实际的数据。和单例模式不同的是,配置扩展点生成的代理不是动态代码生成的,而是一个已经编写好的类。不动态生成的原因可能是因为此处的代理只需要涉及List和Map两种固定的类型,不需要根据运行时的情况动态的获取类类型并为其生成代理。下图展示了代理的类结构。