- 浏览: 506131 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
gaoke:
"我觉得这是java动态生成代码的方式得到的,因为使 ...
InvocationHandler中invoke()方法的调用问题 -
lyandyhk:
可以,反正对于我这个水平来说刚刚好,正好全部看懂,满分
InvocationHandler中invoke()方法的调用问题 -
593844923:
Subject subject=(Subject) Proxy ...
InvocationHandler中invoke()方法的调用问题 -
hl174:
写的不错 源码确实有点长 第一次大致看还有些没看怎么明白
InvocationHandler中invoke()方法的调用问题 -
draem0507:
129应该表示为00000000 10000001,转成byt ...
Java的补码表示
这篇文章是基于webx框架官方文档整理的。具体的请参见webx官方文档。
首先先弄明白在面向对象的设计中比较核心的一个原则——OCP(Open-Closed Principle),也就是开闭原则。
最早描述OCP的是OCP原则的提出者Bertrand Meyer,他在他的著作《Object Oriented Software Construction》中提出了OCP原则:“Software entities should be open for extension,but closed for modification”,也就是“软件实体应当对扩展开放,对修改关闭”。简单点说就是如果原有功能没有什么问题而需要扩展新的功能,那么就应该在不修改原有代码的基础上进行功能的扩展。
下面将要讲到的SpringExt就是为了符合OCP原则而对Spring的一种扩展。
SpringExt装配服务
webx中有一个非常有用的ResourceLoadingService,它可以从各种输入源中(比如FileSystem、Classpath、Webapp等等)读取源文件的一种服务。下面就以这个服务为例来说明一下SpringExt是如何对Spring进行扩展使其符合OCP原则。
ResourceLoadingService的结构如下所示
下面我们以这个为例来看一下Spring Beans是如何装载Resource Loading服务的。
Spring2.0之前只能使用如下的xml配置来进行装载
上面的配置如果有点Spring基础的都应该看的懂,典型的IOC。ResourceLoadingServiceImpl并不依赖FileResourceLoader和WebappResourceLoader,它只依赖它们的接口ResourceLoader。至于如何创建FileResourceLoader、WebappResourceLoader、需要提供哪些参数,这些都由spring来负责。
Spring本身并不了解如何创建ResourceLoader对象、用哪些参数、如何注入等等。但并不是说没有人关注这些。这些事情由装配者(程序员)来解决,也就是写这些配置文件的人。
先定义两个角色:服务提供者、服务使用者。ResourceLoadingService的作者是服务提供者,也就是写ResourceLoadingService服务的人。使用ResourceLoadingService的人就是服务使用者,服务使用者利用Spring吧ResourceLoadingService和ResourceLoader装配在一起。
这种配置文件的方式可能会带来比较一些问题。
1、没有检验机制,只能在运行时发现错误。
2、除了阅读源代码,无从得知更多的约束条件。
3、如果服务的实现改变了,这个配置文件可能会失败。因为从bean的class属性可以看出,bean是直接依赖于具体的实现的。
Spring Schema
关于Xml Schema可以参考http://www.w3school.com.cn/schema/index.asp,这里不再赘述。
Spring2.0之后可以用Spring Schema改写为下面:
首先说一下这个配置文件的优点。
1、简洁易读。
2、可验证。
3、可以包含约束条件。
4、服务的细节对装配者隐藏。这也是最重要的一点,从配置文件中可以看出,并没有引用具体的实现类。那么当服务的实现类被改变时,只要Xml Schema没有变,Spring的配置就不会受到影响。
虽然配置文件中没有体现出具体的实现,但是Spring需要知道这些内容。那Spring是怎么知道的?
每个schema都会有一个解释器。解释器是有服务的开发者提供的。解释器会将符合标准的xml schema转换成Spring能读懂的beans定义。
上面这个图就很清晰了。服务的使用者不知道API的具体实现,这样的三层结构相当于减少了耦合。
但是,Spring Schema也存在一个问题,就是无法扩展。比如,下面的配置文件就是错误的,因为Spring Schema无法解析。
我们需要添加新的加载器,但是schema并没有预料到这种情况,所以schema中并没有这方面的信息,因此无法解析上面的配置文件。如果我们要求Spring Schema来解析新的加载器,那必须要修改Schema的定义文件。很显然,这违背了OCP原则。
SpringExt Schema
SpringExt Schema可以将Spring Schema进行进一步的更改:
上面的配置文件就可以正确解析,但是并没有对原有的schema做修改。仔细对比一下这两个配置文件,可以发现后一个配置文件中出现了两个xmlns,这也导致了标签的相关书写也不太一样,比如loaders:file-loader。
SpringExt Schema的原理
下面是resource-loading.xsd的片段:
熟悉schema规则的很容易明白SpringExt是如何进行扩展的,关键在<xsd:any>这个标签。
总结性的讲,在上面的例子中,Spring Schema中定义了一个namespace,而SpringExt Schema定义了两个namespace。这就是关键所在,SpringExt把需要扩展的schema进行了分离,如果我们需要进行扩展,那么添加一个新的xsd文件即可。
首先先弄明白在面向对象的设计中比较核心的一个原则——OCP(Open-Closed Principle),也就是开闭原则。
最早描述OCP的是OCP原则的提出者Bertrand Meyer,他在他的著作《Object Oriented Software Construction》中提出了OCP原则:“Software entities should be open for extension,but closed for modification”,也就是“软件实体应当对扩展开放,对修改关闭”。简单点说就是如果原有功能没有什么问题而需要扩展新的功能,那么就应该在不修改原有代码的基础上进行功能的扩展。
下面将要讲到的SpringExt就是为了符合OCP原则而对Spring的一种扩展。
SpringExt装配服务
webx中有一个非常有用的ResourceLoadingService,它可以从各种输入源中(比如FileSystem、Classpath、Webapp等等)读取源文件的一种服务。下面就以这个服务为例来说明一下SpringExt是如何对Spring进行扩展使其符合OCP原则。
ResourceLoadingService的结构如下所示
下面我们以这个为例来看一下Spring Beans是如何装载Resource Loading服务的。
Spring2.0之前只能使用如下的xml配置来进行装载
<bean id="resourceLoadingService" class="com.alibaba...ResourceLoadingServiceImpl"> <property name="mappings"> <map> <entry key="/file" value-ref="fileLoader" /> <entry key="/webroot" value-ref="webappLoader" /> </map> </property> </bean> <bean id="fileLoader" class="com.alibaba...FileResourceLoader"> <property name="basedir" value="${user.home}" /> </bean> <bean id="webappLoader" class=" com.alibaba...WebappResourceLoader" />
上面的配置如果有点Spring基础的都应该看的懂,典型的IOC。ResourceLoadingServiceImpl并不依赖FileResourceLoader和WebappResourceLoader,它只依赖它们的接口ResourceLoader。至于如何创建FileResourceLoader、WebappResourceLoader、需要提供哪些参数,这些都由spring来负责。
Spring本身并不了解如何创建ResourceLoader对象、用哪些参数、如何注入等等。但并不是说没有人关注这些。这些事情由装配者(程序员)来解决,也就是写这些配置文件的人。
先定义两个角色:服务提供者、服务使用者。ResourceLoadingService的作者是服务提供者,也就是写ResourceLoadingService服务的人。使用ResourceLoadingService的人就是服务使用者,服务使用者利用Spring吧ResourceLoadingService和ResourceLoader装配在一起。
这种配置文件的方式可能会带来比较一些问题。
1、没有检验机制,只能在运行时发现错误。
2、除了阅读源代码,无从得知更多的约束条件。
3、如果服务的实现改变了,这个配置文件可能会失败。因为从bean的class属性可以看出,bean是直接依赖于具体的实现的。
Spring Schema
关于Xml Schema可以参考http://www.w3school.com.cn/schema/index.asp,这里不再赘述。
Spring2.0之后可以用Spring Schema改写为下面:
<resource-loading id="resourceLoadingService" xmlns="http://www.alibaba.com/schema/services/resource-loading"> <resource pattern="/file"> <file-loader basedir="${user.home}" /> </resource> <resource pattern="/webroot"> <webapp-loader /> </resource> </resource-loading>
首先说一下这个配置文件的优点。
1、简洁易读。
2、可验证。
3、可以包含约束条件。
4、服务的细节对装配者隐藏。这也是最重要的一点,从配置文件中可以看出,并没有引用具体的实现类。那么当服务的实现类被改变时,只要Xml Schema没有变,Spring的配置就不会受到影响。
虽然配置文件中没有体现出具体的实现,但是Spring需要知道这些内容。那Spring是怎么知道的?
每个schema都会有一个解释器。解释器是有服务的开发者提供的。解释器会将符合标准的xml schema转换成Spring能读懂的beans定义。
上面这个图就很清晰了。服务的使用者不知道API的具体实现,这样的三层结构相当于减少了耦合。
但是,Spring Schema也存在一个问题,就是无法扩展。比如,下面的配置文件就是错误的,因为Spring Schema无法解析。
<resource-loading id="resourceLoadingService" xmlns="http://www.alibaba.com/schema/services/resource-loading"> <resource pattern="/file"> <file-loader basedir="${user.home}" /> </resource> <resource pattern="/webroot"> <webapp-loader /> </resource> <resource pattern="/db"> <database-loader connection="jdbc:mysql:mydb" /> </resource> </resource-loading>
我们需要添加新的加载器,但是schema并没有预料到这种情况,所以schema中并没有这方面的信息,因此无法解析上面的配置文件。如果我们要求Spring Schema来解析新的加载器,那必须要修改Schema的定义文件。很显然,这违背了OCP原则。
SpringExt Schema
SpringExt Schema可以将Spring Schema进行进一步的更改:
<resource-loading id="resourceLoadingService" xmlns="http://www.alibaba.com/schema/services" xmlns:loaders="http://www.alibaba.com/schema/services/resource-loading/loaders"> <resource pattern="/file"> <loaders:file-loader basedir="${user.home}" /> </resource> <resource pattern="/webroot"> <loaders:webapp-loader /> </resource> <resource pattern="/db"> <loaders:database-loader connection="jdbc:mysql:mydb" /> </resource> </resource-loading>
上面的配置文件就可以正确解析,但是并没有对原有的schema做修改。仔细对比一下这两个配置文件,可以发现后一个配置文件中出现了两个xmlns,这也导致了标签的相关书写也不太一样,比如loaders:file-loader。
SpringExt Schema的原理
下面是resource-loading.xsd的片段:
<xsd:element name="resource" type="ResourceLoadingServiceResourceType"> <xsd:complexType name="ResourceLoadingServiceResourceType"> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:any namespace="http://www.alibaba.com/schema/services/resource-loading/loaders" /> </xsd:choice> <xsd:attribute name="pattern" type="xsd:string" use="required" /> </xsd:complexType>
熟悉schema规则的很容易明白SpringExt是如何进行扩展的,关键在<xsd:any>这个标签。
总结性的讲,在上面的例子中,Spring Schema中定义了一个namespace,而SpringExt Schema定义了两个namespace。这就是关键所在,SpringExt把需要扩展的schema进行了分离,如果我们需要进行扩展,那么添加一个新的xsd文件即可。
发表评论
-
Spring利用注解进行多次拦截
2015-08-23 11:43 3904最近在用Spri ... -
Hive自定义UDAF详解
2014-07-25 14:14 14717遇到一个Hive ... -
编译libhdfs
2014-02-25 15:32 3783Mysql Applier是Mysql向hdf ... -
Java序列化机制对同一对象的处理
2012-04-20 18:47 0以下例子参考http://developer. ... -
Java的补码表示
2012-04-20 17:19 3989最近发现一个比较低级的问题,就是java中的数 ... -
同步锁的失败可能
2012-04-20 10:29 1100以下例子参考http://developer.51cto.co ... -
优化多线程执行效率
2011-05-22 21:38 1714摘抄自http://zhmocean.itey ... -
ExecutorService与Executors例子的简单剖析
2011-05-11 00:13 6599对于多线程有了一点了解之后,那么来看看java ... -
java深度历险
2011-04-17 20:57 1316InfoQ上面有几篇文章不错,适合已经对jav ... -
Spring整合hibernate配置模版
2011-04-12 20:14 1316下面是用一个具体例子写的模版(支持annota ... -
Java引用类型
2011-04-05 19:00 5484Java有四种引 ... -
double类型运算精度丢失
2011-04-04 15:45 5625前段时间看了一点python入门,写了几个运算 ... -
Java变量初始化
2011-03-29 15:01 1484先看一个例子: public class Te ... -
Java实现循环移位
2011-03-25 20:56 5955做MD5算法时遇到了循环移位,在网上找了写资料 ... -
Java简记
2011-03-18 20:17 1814这里随手做一些记录,以便有空时整理。 ... -
Java的栈和堆
2011-03-12 21:18 1381学的越多, ... -
String的一点东西
2011-03-12 20:24 1037关于String类的一点东西,算是对容易疏忽的 ... -
Html转换为PDF
2011-03-11 13:37 27001、html文件转为xhtml文件 ... -
Understand the Serializable and serialVersionUID
2011-03-08 12:54 1537看了一篇简单介绍serialVersionUI ... -
Overriding and Hiding Methods
2011-03-05 16:18 1666方法的override体现在实例方法(inst ...
相关推荐
Webx-SpringExt是Webx框架的一个扩展,它与Spring框架进行了深度集成,旨在提供更高效、更灵活的Web应用程序开发环境。Eclipse是一个广泛使用的Java集成开发环境(IDE),而这里的"webx-springExt整合eclipse插件"是...
针对IntelliJ IDEA的SpringExt插件,支持xml编辑器中对schema进行提示和验证。安装步骤: idea下File->Settings->Plugins->Install plugin from disk... 选中该zip包进行安装
maven-springext-plugin-1.0.jar
SpringExt Maven插件。通过命令mvn springext:run 命令,在localhost本机上启动一个监听8080端口的Schema Server,通过它就可以访问到所有的schemas。 添加jar到本地仓库命令为:mvn install:install-file -Dfile=E:...
标题“springext:专注于春天”和描述中的“springext 专注于春天”暗示了这是一个与Spring框架相关的项目,可能是一个扩展或者一个围绕Spring生态系统的特定工具或应用。由于标签是“Java”,我们可以推断这个项目是...
maven-springext-plugin-1.0-sources.jar
SpringExt模块的原理非常丰富,涉及到了XML Schema的秘密,扩展点ConfigurationPoint的定义,捐献Contribution的概念以及组件和包的管理。SpringExt的引入大大增强了Spring框架的功能和灵活性。 WebxFramework部分...
##### **2.2 SpringExt原理** - **XMLSchema中的秘密**:SpringExt通过定义自己的Schema来实现对Spring配置的扩展。 - **扩展点(Configuration Point)**:指定配置文件中可以被其他配置文件扩展的位置。 - **捐献...
SpringExt模块支持SpringBeans配置,以及利用SpringSchema和SpringExtSchema扩展框架功能。 Webx的优势还包括其开放性和扩展性。开发者可以根据需求定制和剪裁Webx框架,使得框架能够适应不同的应用场景。例如,在...
**2.2 SpringExt原理** - **XMLSchema中的秘密**:SpringExt通过自定义的XMLSchema定义了新的元素和属性,这些元素和属性主要用于描述Webx特有的组件和配置。 - **扩展点,ConfigurationPoint**:这是一种允许...
NULL 博文链接:https://endeavor416.iteye.com/blog/260472
Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、高性能和灵活的Web应用程序。...ExtJS,则是一款富客户端JavaScript库,用于创建数据驱动、交互性强的桌面式Web应用。这两者的结合可以构建出功能丰富的前端...
- **SpringExt**:SpringExt是Webx3中一个重要的组成部分,主要用于简化Spring框架的配置过程。它引入了XML Schema的概念,通过扩展点(Configuration Point)和捐献(Contribution)机制实现了对Spring配置文件的自动化...
2.2. SpringExt原理 ......................................................................................... 16 2.2.1. XML Schema中的秘密 ...............................................................