[SpringExt 基于Spring,提供扩展组件的能力]
WebX框架中基础服务基于Spring Ext以service bean的形式提供。
(一) 常见的spring bean配置方式
1)通过<beans><bean><property>方式的Spring bean配置方式
这种方案简单易行,很好地体现了Spring的基础理念:IoC(Inversion of Control,依赖反转)
Spring的配置文件会依赖于服务实现类的公开API。装配者除非查看源代码,或者API文档才能精确地获知这些API的细节。
基于Spring IoC容器的业务bean可以这样使用,
但是如果基于Spring IoC容器开发框架组件的话,这样框架使用者为了使用某个组件的功能,可能还要关心组件的部分实现。这样肯定不好啦!!!
2)SpringSchema配置
服务的实现细节对装配者隐藏。
所有的schema都会有一个“解释器”和它对应(即BeanDefinitionParser)。
这个解释器负责将符合schema定义的XML配置,转换成Spring能解读的beans定义。解释器是由服务的开发者来提供的
------------------------------------------------------------------------------------
(二) SpringExt关键概念
1) 扩展点 Configuration Point
对应一个唯一的namespace:
http://www.alibaba.com/schema/services/resource-loading/loaders
对应一个唯一的schema:
services-resource-loading-loaders.xsd
<xsd:any>定义只关心namespace,不关心element的名称,自然可以接受未知的<database-loader>element,前提是<database-loader>的namespace是“http://www.alibaba.com/schema/services/resource-loading/loaders”。
2) 捐献 Contriubtion:对应一个xml中的标签
SpringExt把每一个对扩展点的具体扩展称作“捐献,Contriubtion”
Contribution将element和对 ResourceLoader接口的具体实现 关联起来。
对应一个唯一的schema
3) 总结
Xml和schema文件中
扩展点往往对应于一个namespace;
捐献者对应扩展点namespace的不同Schema中定义的element。
Java代码中
扩展点往往对应于一个接口;捐献者往往对应于这个接口的一个具体实现。
------------------------------------------------------------------------------------
(三)SpringExt 的实现原理——基于SpringSchema配置1)在可能变化的点,针对接口编程。对应的使用这个接口的组件就是一个可扩展点。
针对这个可扩展点的依赖注入,schema中<xsd:any>定义只关心namespace,不关心element的名称
2)由此针对相同的namespace下的不用element就是这个可扩展点的实现
------------------------------------------------------------------------------------
(四)WebX中Spring Ext的应用
Spring Ext 有一个顶级扩展点“service”;针对这个扩展点的不同捐献即各种服务组件
另外,SpringExt针对组件有特别的定义:
在SpringExt中,一个模块既可以成为别的模块的扩展,也可以被别的模块来扩展。这样的模块被称为“组件”。
应用Spring Ext分如下几个关键步骤
-----如何定义扩展点
1) 定义扩展点的xsd,其中要明确所有该扩展点的捐献需要的namespace【比如顶级扩展点service】
2) 对应扩展点在java代码中定义好接口
3) 对应有解析类
------基于已有的扩展点,如何定义和使用捐献
1) 定义一个捐献的xsd文件,这里面就是应对变化添加的内容
2) <Beans>中引用这个xsd文件,并且进行配置即指明扩展点namespace,但是可以有不同的element name。
3) 对应有一个实现解析的类,可以解析element成为一个扩展点接口的实现类
这里有一个关键问题是SpringExt在什么位置定位xsd文件?
取得schema内容的途径:
1) 访问schemaLocation所指示的网址
外部服务器
使用SpringExt所提供的maven插件(mvnspringext:run),在localhost本机上启动一个监听8080端口的Schema Server,通过它就可以访问到所有的schema
2) 将所有的schema保存在本地,然后定义一个标准的XML Catalog来访问这些schema文件
-----------------------------------------------------------------------------------
编写 XSD文件
编写 NamespaceHandler和 BeanDefinitionParser 完成解析工作
编写 spring.handlers和 spring.schemas串联起所有部件
在 Bean文件中应用