2011-08-01 37 views
7

Không thể sử dụng @Value trên biến tĩnh.Cách thay thế chú thích @Value trong chức năng tĩnh

@Value("${some.value}") 
static private int someValue; 

static public void useValue() { 
    System.out.println(someValue); 
} 

Khi tôi làm điều này, 0 được in. Vì vậy, một lựa chọn tốt cho điều này là gì?

+0

Nếu bạn yêu cầu thay thế: ngữ cảnh là gì? – Ralph

Trả lời

9

Ghi chú tiêm xuân trong trường tĩnh (theo mặc định).

Vì vậy, bạn có hai lựa chọn:

  • (tốt hơn một) làm cho các phi trường tĩnh
  • (xấu xí hack) thêm một setter tĩnh không mà viết trong lĩnh vực tĩnh, và thêm @Value chú thích đến setter.

+0

Tôi có thể truy cập vào các giá trị thuộc tính từ hàm tĩnh theo cách không phải lò xo không? –

+0

@Sangdol: thông qua ngữ cảnh ứng dụng: http://sujitpal.blogspot.com/2007/03/accessing-spring-beans-from-legacy-code.html – Ralph

2

Để ngăn chặn bao giờ lặp lại tiêm của cùng một giá trị tạo ra một trường không tĩnh trong một lớp được khởi tạo rất thường xuyên, tôi thích tạo một Singleton ConfigUtil đơn giản như một cách giải quyết:

package de.agitos.app.util; 

import org.springframework.beans.factory.annotation.Configurable; 
import org.springframework.beans.factory.annotation.Value; 

/** 
* Helper class to get injected configuration values from static methods 
* 
* @author Florian Sager 
* 
*/ 

@Configurable 
public class ConfigUtil { 

    private static ConfigUtil instance = new ConfigUtil(); 

    public static ConfigUtil getInstance() { 
     return instance; 
    } 

    private @Value("${my.value1}") Integer value1; 

    public Integer getValue1() { 
     return value1; 
    } 
} 

Bên trong lớp tôi đã cố gắng để đưa các giá trị đầu tiên như một Integer tĩnh:

private static Integer value1 = ConfigUtil.getInstance().getValue1(); 
+0

Tôi đã thử điều này và nó không hoạt động (tất nhiên, bởi vì bạn xây dựng 'ConfigUtil' bằng toán tử' new'. – membersound

2

Sử dụng thủ thuật đơn giản này để đạt được những gì bạn muốn (cách tốt hơn so với có giá trị tiêm vào setters không tĩnh và văn bản do đó, một trường tĩnh - như đề xuất trong câu trả lời được chấp nhận):

@Service 
public class ConfigUtil { 
    public static ConfigUtil INSTANCE; 

    @Value("${some.value}) 
    private String value; 

    @PostConstruct 
    public void init() { 
     INSTANCE = this;   
    } 

    public String getValue() { 
     return value; 
    } 
} 

Sử dụng như:

ConfigUtil.INSTANCE.getValue();

Các vấn đề liên quan