2011-06-21 41 views
12

Tôi đang cố gắng tải một tệp thuộc tính vào một bean Spring và sau đó tiêm bean đó vào một lớp.Tiêm các thuộc tính bằng cách sử dụng Spring & annotation @Value

Phần duy nhất tôi không thể làm việc dường như đang sử dụng tài liệu tham khảo @Resource.Có ai đó kết nối phần cuối cùng cho tôi không? Tôi nhận được một giá trị null mỗi lần. Dường như không muốn tiêm giá trị.

[EDIT] - Ban đầu tôi nghĩ sử dụng @Resource là cách tốt nhất nhưng giải pháp được đề xuất tôi thấy dễ dàng hơn.

tôi thấy giải pháp này trong bài khác:

tham khảo Giải pháp Link:Inject Property Value into Spring - posted by DON

tín dụng đối với Don cho bài nhưng tôi chỉ là không chắc chắn làm thế nào để hoàn thành nó với @Resource .

Kết quả gỡ lỗi: Giá trị biến appProperties luôn là giá trị rỗng. Nó không được tiêm.

Cấu hình mùa xuân. enter image description here

Mẫu Class:

package test; 

import java.util.Properties; 
import javax.annotation.Resource; 


public class foo { 
    public foo() {} 
    @Resource private java.util.Properties appProperties; 
} 

Dựa trên những lời khuyên trong các giải pháp đã được phê duyệt dưới đây. Dưới đây là những thay đổi tôi đã thực hiện.


Solution Cập nhật:

Xuân Config: enter image description here

Java Class: enter image description here

+0

Điều gì xảy ra khi bạn cố gắng giải pháp của bạn? – skaffman

+0

Riêng thuộc tính @Resource là lỗi đánh máy? bạn đã thử thuộc tính riêng tư @Resource chưa? Tôi không chắc nó không hoạt động như thế này Tôi chưa bao giờ thấy chú thích không phải trước công cụ sửa đổi. – abalogh

+0

@Skaffman - Tôi nhận được một giá trị null. Giá trị biến không bị ràng buộc và được tiêm. – haju

Trả lời

17

Đối với giải pháp của bạn để làm việc bạn cũng sẽ cần phải thực hiện một foo Xuân quản lý đậu; bởi vì nếu không Spring sẽ biết rằng nó phải đối phó với bất kỳ chú thích nào của bạn trên lớp học của bạn?

  • Bạn có thể xác định nó trong xml appcontext của bạn như là một bean với ..class="foo"
  • Hoặc sử dụng component-scan và chỉ định một gói cơ sở, trong đó có lớp foo của bạn.

Vì tôi không hoàn toàn chắc chắn đây là chính xác những gì bạn muốn (không bạn muốn có một .properties tập tin để được phân tích bởi mùa xuân và có nó cặp khóa-giá trị có sẵn thay vì một đối tượng Properties?), Tôi gợi ý cho bạn một giải pháp: Sử dụng util namespace

<util:properties id="props" location="classpath:com/foo/bar/props.properties"/> 

Và tham khảo các giá trị bên trong hạt cà phê của bạn (cũng có, đã là mùa xuân quản lý):

@Value("#{props.foo}") 
public void setFoo(String foo) { 
    this.foo = foo; 
} 

EDIT:

chỉ nhận ra rằng bạn đang nhập org.springframework.context.ApplicationContext trong lớp học của bạn mà có lẽ là không cần thiết. Tôi mạnh mẽ khuyến khích bạn đọc Spring reference ít nhất là một vài chương đầu tiên, bởi vì a) đó là một bài đọc tuyệt vời b) bạn sẽ thấy dễ hiểu hơn về mùa xuân nếu những điều cơ bản rõ ràng.

+0

Cảm ơn tôi sẽ cố gắng với thẻ haju

+0

Nếu tôi chọn phương pháp triển khai đầu tiên không sử dụng @Component với tính năng quét thành phần, tôi sẽ không sử dụng @Value nữa vì tôi sẽ phải tiêm vào cấu hình mùa xuân? – haju

+0

Cũng lưu ý rằng giá trị bạn đưa vào bên trong @Value, "# {props.foo}" trong ví dụ trên, không được chứa dấu chấm cho thuộc tính KEY ("foo" trong ví dụ này). Tôi đã di cư để sử dụng EL từ trường học cũ, nơi các khóa của tôi bên trong tập tin tài sản có dạng a.b.c = xyz vv Và nó đã thất bại. Trong khi đó, nói abc = xyz làm việc. – arcseldon

3

Chỉ thêm một giải pháp bằng cách sử dụng trình giữ chỗ thuộc tính.

Bối cảnh mùa xuân:

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <context:component-scan base-package="your.packege" /> 

    <context:property-placeholder location="classpath*:*.properties"/> 

</beans> 

Lớp java nơi bạn muốn tiêm thuộc tính giá trị:

public class ClassWithInjectedProperty { 

    @Value("${props.foo}") 
    private String foo; 
} 
Các vấn đề liên quan