Spring 的优秀工具类盘点,第 1 部分: 文件资源操作和 Web 相关工具类
Spring 的优秀工具类盘点,第 1 部分: 文件资源操作和 Web 相关工具类
转自:http://www.ibm.com/developerworks/cn/java/j-lo-spring-utils1/
对于位于远程服务器(Web 服务器或 FTP 服务器)的文件资源,您则可以方便地通过 UrlResource 进行访问。
为了方便访问不同类型的资源,您必须使用相应的 Resource 实现类,是否可以在不显式使用 Resource实现类的情况下,仅根据带特殊前缀的资源地址直接加载文件资源呢?Spring 提供了一个 ResourceUtils工具类,它支持“classpath:”和“file:”的地址前缀,它能够从指定的地址加载文件资源,请看下面的例子:
提示
一些Web应用服务器(如 Tomcat)不会为不同的Web应用使用独立的系统参数,也就是说,应用服务器上所有的 Web应用都共享同一个系统参数对象。这时,您必须通过webAppRootKey 上下文参数为不同Web应用指定不同的属性名:如第一个 Web应用使用 webapp1.root 而第二个 Web 应用使用 webapp2.root等,这样才不会发生后者覆盖前者的问题。此外,WebAppRootListener 和 Log4jConfigListener 都只能应用在Web 应用部署后 WAR 文件会解包的 Web 应用服务器上。一些 Web 应用服务器不会将Web 应用的 WAR 文件解包,整个 Web应用以一个 WAR 包的方式存在(如 Weblogic),此时因为无法指定对应文件系统的 Web 应用根目录,使用这两个监听器将会发生问题。
Log4jConfigListener监听器包括了 WebAppRootListener 的功能,也就是说,Log4jConfigListener 会自动完成将 Web应用根目录以 webAppRootKey 上下文参数指定的属性名添加到系统参数中,所以当您使用 Log4jConfigListener后,就没有必须再使用 WebAppRootListener了。
Introspector 缓存清除监听器
Spring还提供了一个名为 org.springframework.web.util.IntrospectorCleanupListener的监听器。它主要负责处理由 JavaBean Introspector功能而引起的缓存泄露。IntrospectorCleanupListener 监听器在 Web 应用关闭的时会负责清除 JavaBeanIntrospector 的缓存,在 web.xml 中注册这个监听器可以保证在 Web 应用关闭的时候释放与其相关的 ClassLoader的缓存和类引用。如果您使用了 JavaBean Introspector 分析应用中的类,Introspector缓存会保留这些类的引用,结果在应用关闭的时候,这些类以及Web 应用相关的 ClassLoader 不能被垃圾回收。不幸的是,清除Introspector 的唯一方式是刷新整个缓存,这是因为没法准确判断哪些是属于本 Web 应用的引用对象,哪些是属于其它 Web应用的引用对象。所以删除被缓存的 Introspection 会导致将整个 JVM 所有应用的 Introspection都删掉。需要注意的是,Spring 托管的 Bean 不需要使用这个监听器,因为 Spring 的 Introspection所使用的缓存在分析完一个类之后会马上从 javaBean Introspector 缓存中清除掉,并将缓存保存在应用程序特定的ClassLoader 中,所以它们一般不会导致内存资源泄露。但是一些类库和框架往往会产生这个问题。例如 Struts 和 Quartz 的Introspector 的内存泄漏会导致整个的 Web 应用的 ClassLoader 不能进行垃圾回收。在 Web应用关闭之后,您还会看到此应用的所有静态类引用,这个错误当然不是由这个类自身引起的。解决这个问题的方法很简单,您仅需在 web.xml 中配置IntrospectorCleanupListener 监听器就可以了:
陈雄华,2002 年毕业于厦门大学计算机与信息工程学院,获硕士学位。是宝宝淘科技有限公司的创始人之一(http://www.baobaotao.com),这是一个服务于全国母婴用户的综合性网站,作者负责网站整体框架设计以及核心代码开发的工作。技术开发之余,常将经验所得行诸于文字,作者是国内多个著名技术网站的专栏作者,在各大技术网站、报刊杂志发表过数十篇技术文章,广受读者好评。于 2005 年出版《精通 JBuilder2005》,于2007年出版《精通 Spring 2.x--企业应用开发详解》,其新作《EXT2.x开发详解――AJAX和Web页面布局王者至尊》即将出版。