Spring:为类路径资源注入URL

15

我希望以一种不会在Bean中创建对Spring接口/类依赖的方式注入类路径资源的URL。请问如何实现?


“URL” 究竟是什么意思?对于类路径资源来说,这是一个相当人为的概念 - 您会如何处理该 URL? - skaffman
打开一个流并从中读取 - IttayD
如果它是类路径资源,为什么不直接注入路径本身呢?如果你不打算使用Spring资源抽象,那么它就没有太多价值。 - skaffman
@skaffman 因为它是通过类路径定位的,这意味着它是通过bean工厂使用的类加载器定位的,而不是使用路径的bean的类加载器(由于委派机制)。 - IttayD
如果你这么说的话,我并不相信那会起作用。 - skaffman
4个回答

15

Spring可以隐式地将classpath:...值转换为java.net.URL:

public class Foo {
    private URL url;
    ...
}

.

<bean class = "Foo">
    <property name = "url" value = "classpath:..." />
</bean>

2
由以下原因引起: org.springframework.core.convert.ConversionFailedException: 无法将类型为“java.lang.String”的值 “classpath:etc/warmup.xml” 转换为类型“java.net.URL”; 嵌套异常是 java.net.MalformedURLException: 未知协议: classpath - IttayD
@IttayD:在Spring 3.0.2中对我来说运行良好。请注意,路径必须指向现有资源。 - axtavt
我有Spring 3.0.4。我查看了Spring的源代码,没有发现它如何处理“classpath:” URL。从我所看到的,它只是简单地尝试将其转换为URL。我找不到任何“classpath”的URLStreamHandler实现。 - IttayD
1
@IttayD: Spring使用PropertyEditor来转换属性值。classpath:URL的转换由URLEditor处理。 - axtavt

5

继续axtavt的回答,如果您允许在bean中使用Spring注释,可以像这样实现:

@Value("classpath:myClasspathLocation") private URL url;

2

通过扩展org.springframework.core.io.ClassPathResource实现自己的Spring资源,例如MyClasspathResource扩展ClassPathResource,将此类型注入到您的bean中。这样,您就不需要依赖于Spring,并且以后可以使用其他方式重新实现资源。

<bean class="myBean">
 <property name="classPathType">
  <bean class="org.test.bla.MyClasspathResource">
   <constructor-arg index="0" value="classpath:/org/test/bla/MyUrl" />
  </bean>
 </property>
</bean>

1

几乎没有什么非Spring框架的东西可以与Spring的资源概念相媲美。

例如,您可以使用GuavaInputSupplier作为替代方案,但如果这样做,您将会错过强大的标准Spring功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接