2011-01-02 5 views
15

Bean의 Spring에 의존성을 생성하지 않는 방식으로 클래스 패스 리소스의 URL을 삽입하고 싶습니다. 즉, 빈은 Spring의 인터페이스/클래스를 사용하면 안된다. 어떻게해야합니까?스프링 : 클래스 패스 리소스에 대한 URL을 입력하십시오.

+0

정확히, "URL"은 무엇을 의미합니까? 이것은 클래스 패스 리소스를 가진 다소 인공적인 개념입니다 - 당신은 그 URL로 무엇을 할 것입니까? – skaffman

+0

스트림을 열고 스트림에서 읽기 – IttayD

+0

클래스 경로 리소스 인 경우 경로 자체를 주입하지 않는 이유는 무엇입니까? Spring 리소스 추상화에는 가치가 없다. – skaffman

답변

15

봄은 암시 적으로 java.net.URLclasspath:... 값을 변환 할 수 있습니다 :

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

.

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

발생 원인 : org.springframework.core.convert.ConversionFailedException : "classpath : etc/warmup.xml"값을 'java.lang.String'유형에서 'java.net.URL'유형으로 변환 할 수 없습니다. 중첩 예외는 java.net.MalformedURLException : 알 수없는 프로토콜 : classpath – IttayD

+0

@IttayD : Spring 3.0.2에서 제대로 작동합니다. 경로는 기존 자원을 가리켜 야합니다. – axtavt

+0

봄 3.0.4 있습니다. 봄의 소스 코드를 살펴본 결과 클래스 패스가 처리되는 곳을 볼 수 없습니다. 다른 URL도 있습니다. 내가보기에는 URL로 변환하려고합니다. "classpath"에 대한 URLStreamHandler 구현을 찾을 수 없습니다. – IttayD

2

MyClasspathResource와 같이 org.springframework.core.io.ClassPathResource를 확장하여 Spring 리소스를 직접 구현하여 ClassPathResource를 확장하고이 유형을 빈에 삽입한다. 이렇게하면 봄에 의존 할 필요가 없으며 나중에 다른 것으로 리소스를 재 구현할 수 있습니다.

<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> 
4

자신이 빈에서 주석을 봄 수 있다면, 당신은 이런 식으로 작업을 수행 할 수 axtavt의 대답에 이어 :

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