1、资源加载的触发点
在web应用中,spring容器的初始化是从ServletContextListener开始。大家知道ServletContextListener是配置在web.xml中。
<!-- 装载/WEB-INF/webx.xml, /WEB-INF/webx-*.xml -->
<listener>
<listener-class>
com.alibaba.citrus.webx.context.WebxContextLoaderListener
</listener-class>
</listener>
从com.alibaba.citrus.webx.context.WebxContextLoaderListener的源码中我们可以看出他是继承自spring框架的
ContextLoaderListener 的。
public class WebxContextLoaderListener extends ContextLoaderListener {
@Override
protected final ContextLoader createContextLoader() {
return new WebxComponentsLoader() {
@Override
protected Class<?> getDefaultContextClass() {
Class<?> defaultContextClass = WebxContextLoaderListener.this.getDefaultContextClass();
if (defaultContextClass == null) {
defaultContextClass = super.getDefaultContextClass();
}
return defaultContextClass;
}
};
}
protected Class<?> getDefaultContextClass() {
return null;
}
}
这段代码我们可以看出以下spring初始化中关键的几点。
1.指定了spring上下文加载器ContextLoader是WebxComponentsLoader的匿名子类。
2.该匿名子类指定了默认的上下文Class同WebxComponentsLoader的一样。
接下来我们可以看到WebComponentssLoader的Class<?> getDefaultContextClass() 方法指定默认的WebApplicationContext是WebxComponentsContext
WebxComponentsContext的Type Hierachy如下图所示。

webx3中的com.alibaba.citrus.springext.support.context.XmlWebApplicationContext中支持扩展的resource loading机制。
通过重写protected Resource getResourceByPath(String path) 和protected ResourcePatternResolver getResourcePatternResolver() 两个方法完成了支持扩展ResourcePatternResolver机制(即:实现自定义的资源装载)。
另外该类还重写了 protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader),所以XmlBeanDefinitionReader可以自动的识别webx中的一些标签(其中就包括resource-loding)。
2.webx中的resource loading。
webx扩展了spring的resource loader。在spring配置文件中添加ResourceLoading服务时,ResourceLoader 即被切换到新的机制。新的机制可兼容原有的Spring配置和代码,但支持更多的资源装载方式,以及支持重命名、重定向资源。
当ResourceLoadingService收到资源加载的请求后,将通过ResourceMapping查找合适的ResourceLoader来加载资源。各类ResourceLoader会根据资源名称将资源加载进内存并转换为webx框架自定义的Resource。随后这些自定义resource将会被适配为spring框架中的Resource。
简单的类图关系如下:

3.resource loading的使用范例:
只要在webx.xml中添加resource-loading的配置,webx就会自动的将加载方式重spring的resource loader切换到resource loading。
3.1)重命名资源,取消资源名称和资源环境的相关性。
<resource-loading
xmlns="http://www.alibaba.com/schema/services"
xmlns:res-loaders="http://www.alibaba.com/schema/services/resource-loading/loaders">
...
<resource-alias pattern="/myapp/conf" name="/webroot/WEB-INF" />
<resource pattern="/webroot" internal="true">
<res-loaders:webapp-loader />
</resource>
</resource-loading>
3.2)重定向资源
这个开发的时候用的最多,一般会将template资源指向开发目录下的template就可以了,这样每次修改后不需要重新部署就可以看到修改的效果。
<resource-loading
xmlns="http://www.alibaba.com/schema/services"
xmlns:res-loaders="http://www.alibaba.com/schema/services/resource-loading/loaders">
...
<resource pattern="/templates">
<res-loaders:file-loader basedir="${dev_root}/templates" />
</resource>
...
</resource-loading>
当然貌似上边的资源重命名也可以实现这个功能。呵呵
3.3)通过通配符来匹配资源
ResourceLoading服务支持用通配符来匹配资源名称或资源别名(alias)。通配符定义如下,不过好像现在项目没有接触到用的地方。
a.“*”匹配0-n个字符,但不包括“/”。即,“*”只匹配一级目录或文件中的零个或多个字符
b.“**”匹配0-n个字符,包括“/”。即,“**”匹配多级目录或文件
c.“?”匹配0-1个字符,但不包括“/”。即,“?”匹配一级目录或文件中的零个或一个字符
所有的匹配,将被按顺序赋予变量“$1”、“$2”、“$3”、“$4”、……。这些变量可以在其它地方被引用。
3.4)特殊的super-loader
如果spring容器是多级的,默认的resource loading服务是现在当前容器查找资源如果不存在,那么去赴容器中查找。如此级联查找,如果都找不到,那么就放弃。
如果找到会返回第一个找到的结果。
如果要引用的资源知道在赴容器中那么就可以直接用这个super-loader,不过他默认的仍然是这样子查找只要不指定name就会直接去parent容器查找了。
我们也可以变更这个级联查找的顺序,比如要先在赴容器查找然后才在子容器查找,就可以这样配置了。
<resource pattern="/reverseLookup">
<!-- 先找parent容器中的ResourceLoading服务 -->
<res-loaders:super-loader />
<!-- 再找当前容器中的ResourceLoader -->
<res-loaders:file-loader />
</resource>

- 大小: 45.2 KB

- 大小: 59.4 KB
分享到:
相关推荐
WebX是一个基于Java的开源Web应用框架,它提供了一种高效、灵活的...参考提供的文档和资源,如《Webx配置文件加载顺序与作用.docx》、《webx基础.docx》和《表单验证webx.pptx》,将有助于进一步提升WebX的使用技能。
这部分内容为开发者提供了全面的资源管理能力,尤其在多资源加载器环境下和非Web环境下的资源使用提供了详尽的指导。 Filter、RequestContexts和Pipeline部分介绍了Webx框架中的过滤器机制。Filter在Webx框架中承担...
- **在非Web环境中使用ResourceLoading服务**:即使在没有Web服务器支持的情况下,也可以使用ResourceLoading服务来加载资源。 **5.4 ResourceLoader参考** - **FileResourceLoader**:用于加载本地文件系统的资源...
Webx框架的基础设施服务部分是不可或缺的,它支持了资源的加载和管理。这部分内容详细介绍了资源的概念,如何表示和访问资源,以及资源的遍历。Webx使用Spring的ResourceLoader机制来装载资源,但也有其自己的...
通过定义新资源、重命名资源、重定向资源等高级特性,Webx提供了灵活的资源处理方式。 此外,Webx还提供了Filter、RequestContexts和Pipeline机制,这些机制帮助Webx更加高效地处理HTTP请求。Filter机制用于拦截和...
WebX 是一个开源的、基于Java的企业级Web应用框架,主要设计用于构建企业信息系统和B/S架构的应用。这个框架提供了一整套开发工具和技术支持,包括数据库操作、表单处理、权限控制、模板引擎等功能,旨在提高开发...
此外,阅读官方文档和社区资源也是快速掌握Webx的关键。最后,对于初学者,可以参考提供的PPT材料,如"Webx及框架简介(1).ppt"和"Webx及框架简介(2).ppt",它们通常包含框架的基本介绍、使用示例和最佳实践,能够...
**淘宝WEBX框架详解** 淘宝WEBX框架是一个专为大型电子商务平台设计的高效、可扩展的Web应用程序开发框架。这个框架由阿里巴巴技术部门研发,旨在提高开发效率,保证系统的稳定性和可维护性,同时降低新手入门的...
- **初始化**:Webx3.0的初始化主要由`WebxContextLoaderListener`完成,它负责加载配置文件,并初始化日志系统。 - **执行流程**:请求处理过程通过Pipeline来管理,包括URI解析、请求上下文处理等多个环节,确保了...
- **装载parent容器中的资源**:能够跨容器加载资源,增加了系统的扩展性。 - **修改资源文件的内容**:在不改变原始文件的前提下对内容进行修改。 - **直接使用ResourceLoadingService**:介绍了如何直接调用服务来...
“源码”标签表明内容可能包括了对Webx框架源代码的分析,这对于开发者来说是极其宝贵的资源,因为它可以帮助理解框架内部的工作机制,从而更好地定制和优化自己的项目。“工具”标签则暗示了可能有Webx相关的辅助...
WebX项目的典型结构包括src/main/java(存放Java代码)、src/main/resources(存放资源配置文件)、WEB-INF(存放web.xml等Web应用配置文件)等。了解这些目录的作用对于后续开发至关重要。 4. **控制器...
WEBX是阿里巴巴的内部框架,“就是把页面与Service层之间的一些Servlet等公共的东西抽象出来,提供相应的服务以提高开发效率(《接口测试之Webx简介》—何晓峰 )”,可以看出,webx和传统的servlet-action模式的...
webx3.0学习小结
llerServlet 是 Webx 框架的核心组件,它负责处理所有以 .htm 和 .do 结尾的请求。...对于初学者来说,理解 Webx 的核心概念,如 ControllerServlet 和服务配置,是进一步学习和使用 Webx 的关键。
Features是对插件功能的抽象,定义了一组插件的集合,而plugins目录下的JAR文件则是实际的插件实现,提供了插件的代码和资源。 总的来说,"webx-springExt整合eclipse插件"为Webx-SpringExt开发者提供了集成的开发...
阿里巴巴的J2EE Webx框架是一个企业级的Java应用程序框架,专为构建高效、可扩展且易于维护的Web应用程序而设计。Webx框架的核心理念是模块化,这使得开发过程更加灵活,允许开发者将应用程序的不同部分(如业务逻辑...
WebX3是一个强大的开源Web应用程序框架,主要用于构建企业级的Web应用系统。...这个压缩包中的资源为学习WebX3提供了一个很好的起点,通过实践这些示例,你可以逐步掌握WebX3的核心技术和开发流程。
除了资源加载服务,Webx还介绍了Filter的用途和工作原理,以及RequestContexts和Pipeline在Webx中的应用。Filter是Web应用中用于请求处理的组件,它具有限制,而Webx对其进行了优化和扩展,提供了更多的定制能力。 ...