4.6. 把Resource作为属性来配置

如果bean自身希望通过一些动态方式决定和提供资源路径,那么让这个bean通过 ResourceLoader 接口去载入资源就很有意义了。考虑一个载入某类模板的例子,其中需要哪种特殊类型由用户的角色决定。 如果同时资源是静态的,完全不使用 ResourceLoader 接口很有意义, 这样只需让这些bean暴露所需的 Resource 属性,并保证他们会被注入。

让注入这些属性的工作变得如此容易的原因是,所有的application context注册并使用了能把 String 路径变为 Resource 对象的特殊 PropertyEditor JavaBeans。因此如果 myBeanResource 类型的template属性, 那它就能够使用简单的字符串配置该资源,如下所示:

<bean id="myBean" class="...">
  <property name="template" value="some/resource/path/myTemplate.txt"/>
</bean>

可以看到资源路径没有前缀,因为application context本身要被作为 ResourceLoader 使用,这个资源会被载入为ClassPathResourceFileSystemResourceServletContextResource等等,这取决于context类型。

如果有必要强制使用特殊的 Resource 类型,那你就可以使用前缀。下面的两个例子说明了如何强制使用 ClassPathResourceUrlResource (其中的第二个被用来访问文件系统中的文件)。

<property name="template" value="classpath:some/resource/path/myTemplate.txt">
<property name="template" value="file:/some/resource/path/myTemplate.txt"/>