2011-01-02 30 views
15

Tôi muốn tiêm URL của tài nguyên classpath theo cách không tạo phụ thuộc vào Spring in the Bean. Có nghĩa là, bean không nên sử dụng các giao diện/lớp của Spring. Làm thế nào tôi có thể làm điều đó?Mùa xuân: Tiêm URL cho tài nguyên lớp học

+0

Ý anh là gì bởi "URL", chính xác? Đây là một khái niệm khá nhân tạo với các tài nguyên classpath - bạn sẽ làm gì với URL đó? – skaffman

+0

mở một luồng và đọc từ đó – IttayD

+0

Nếu đó là tài nguyên classpath, tại sao không chỉ tiêm đường dẫn chính nó? Có rất ít giá trị trong tài nguyên Spring trừu tượng nếu bạn không sử dụng nó. – skaffman

Trả lời

15

mùa xuân có thể chuyển đổi classpath:... giá trị vào java.net.URL ngầm:

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

.

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

Gây ra bởi: org.springframework.core.convert.ConversionFailedException: Không thể chuyển đổi giá trị "classpath: etc/warmup.xml" từ loại 'java.lang.String' thành loại 'java.net.URL'; ngoại lệ lồng nhau là java.net.MalformedURLException: giao thức không xác định: classpath – IttayD

+0

@IttayD: Hoạt động tốt cho tôi trong Spring 3.0.2. Lưu ý rằng đường dẫn phải trỏ đến tài nguyên hiện có. – axtavt

+0

Tôi có mùa xuân 3.0.4. Tôi nhìn vào mã nguồn của mùa xuân và không thể nhìn thấy nơi nó xử lý "classpath:" url bất kỳ khác nhau. Từ những gì tôi thấy nó thường xuyên cố gắng chuyển đổi sang URL. Tôi không thể tìm thấy bất kỳ triển khai URLStreamHandler nào cho "classpath" – IttayD

1

Hầu như không có bất kỳ điều gì không phải mùa xuân tương đương với Spring's resource concept.

Ví dụ: bạn có thể sử dụng Guava 'InputSupplier làm phương án thay thế, nhưng bạn thiếu các tính năng mùa xuân tiêu chuẩn mạnh mẽ nếu bạn làm.

2

tạo việc triển khai tài nguyên lò xo của riêng bạn bằng cách mở rộng org.springframework.core.io.ClassPathResource như MyClasspathResource mở rộng ClassPathResource và đưa loại này vào bean của bạn. Như thế này bạn không có bất kỳ sự phụ thuộc nào vào mùa xuân và sau đó có thể reimplement tài nguyên của bạn với một thứ khác.

<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

Tiếp theo từ câu trả lời axtavt, nếu bạn sẽ cho phép bản thân Học Kỳ Mùa Xuân chú thích trong đậu, bạn có thể làm điều đó như thế này:

@Value("classpath:myClasspathLocation") private URL url; 
Các vấn đề liên quan