静态函数中@Value注释的替代方法

时间:2011-08-01 10:34:07

标签: java spring static annotations

无法在静态变量上使用@Value

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

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

当我这样做时,会打印0。那么什么是这个的好方法?

4 个答案:

答案 0 :(得分:10)

Spring在静态字段中注入注释(默认情况下)。

所以你有两个选择:

  • (更好的一个)使字段非静态
  • (丑陋的黑客)添加一个无静态的setter,它在静态字段中写入,并将@Value注释添加到setter。

答案 1 :(得分:4)

使用这个简单的技巧来实现你想要的东西(比将值注入非静态setter并编写静态字段更好 - 如接受的答案所示):

@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;
    }
}

使用类似:

ConfigUtil.INSTANCE.getValue();

答案 2 :(得分:0)

阻止在经常实例化的类中重复注入相同值,使字段非静态,我更喜欢创建一个简单的Singleton ConfigUtil作为变通方法:

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;
    }
}

在类中,我尝试将值首先作为静态Integer注入:

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

答案 3 :(得分:0)

以下代码对我有用,

public class MappingUtils {

  private static String productTypeList;

  @Value("${productType-list}")
  public void setProductTypeList(String productTypeList) {
    MappingUtils.getProductTypeList = productTypeList;
  }
}