2011-08-31 10 views
36

Với lớp nàyMùa xuân: Làm thế nào để tiêm một giá trị vào trường tĩnh?

@Component 
public class Sample { 

     @Value("${my.name}") 
    public static String name; 


} 

Nếu tôi cố gắng Sample.name, nó luôn luôn là 'null'. Vì vậy, tôi đã thử điều này.

public class Sample { 

    public static String name; 

    @PostConstruct 
    public void init(){ 
     name = privateName; 
    } 

    @Value("${my.name}") 
    private String privateName; 

    public String getPrivateName() { 
     return privateName; 
    } 

    public void setPrivateName(String privateName) { 
     this.privateName = privateName; 
    } 

} 

Mã này hoạt động. Sample.name được đặt đúng. Đây có phải là cách tốt hay không? Nếu không, có cách nào tốt hơn không? Và làm thế nào để làm điều đó?

+0

Điều này sẽ không giải quyết được; nếu biến tĩnh được sử dụng trước khi tạo đối tượng. ví dụ: nếu biến tĩnh được sử dụng trong khối tĩnh để tạo tài nguyên, thì tài nguyên sẽ được tạo bằng null. –

Trả lời

55

Firs of all, public static non- final trường là evil. Mùa xuân không cho phép tiêm vào các trường như vậy vì một lý do.

workaround của bạn hợp lệ, bạn thậm chí không cần đến getter/setter, trường private là đủ. Mặt khác thử điều này:

@Value("${my.name}") 
public void setPrivateName(String privateName) { 
    Sample.name = privateName; 
} 

(làm việc với @Autowired/@Resource). Nhưng để cung cấp cho bạn một số lời khuyên mang tính xây dựng: Tạo lớp thứ hai với trường private và getter thay vì trường public static.

+4

Đối với "trường tĩnh công khai không phải là trường hợp xấu", bạn có thể vui lòng cho tôi một số tham chiếu không? – Anderson

+3

Không cuối cùng có nghĩa là bạn có thể sửa đổi giá trị trường, trong đó, đối với trường tĩnh, ngụ ý xử lý đồng thời luồng - đau a.k.a. trong ngăn xếp. –

+0

Làm thế nào để sử dụng @Value với khối tĩnh? Xin vui lòng hướng dẫn chúng tôi ... Kính trọng, Neha –