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

h6my8fg2  于 2023-01-11  发布在  Java
关注(0)|答案(5)|浏览(361)

不能对静态变量使用@Value

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

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

当我这样做的时候,0就被打印出来了,那么有什么好的替代方法呢?

svdrlsy4

svdrlsy41#

静态字段中的Spring注入注解(默认)。
所以你有两个选择:

  • (较好的一个)使字段非静态
  • (丑陋的黑客)添加一个写入static字段的非静态setter,并将@Value注解添加到setter。
  • 然后是trick with the MethodInvokingFactoryBean--这个例子是针对自动连线字段的,但是我想您也可以将其修改为@Value
ndasle7k

ndasle7k2#

使用这个简单的技巧来实现你想要的(比将值注入到非静态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();

guicsvcw

guicsvcw3#

为了防止重复注入相同的值,从而使频繁示例化的类中的字段变为非静态,我倾向于创建一个简单的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();
xmakbtuz

xmakbtuz4#

以下代码对我有效,

public class MappingUtils {

  private static String productTypeList;

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

wixjitnu5#

假设你有一个叫做config的类名,所以你初始化了这个静态变量。也许你可以用下面的方法来初始化这个变量

class Config
{
 
 private static int someValue;
 
 private Config(@Value("${some.value}") int valueDuringInitialization)//private constructor
 {
    Config.someValue=valueDuringInitialization;
 }
 
 static public void useValue() {
    System.out.println(someValue);
}

}

相关问题