【问题标题】:An alternative to @Value annotation in static function静态函数中 @Value 注释的替代方法
【发布时间】:2011-10-17 08:28:53
【问题描述】:

不能在静态变量上使用@Value

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

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

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

【问题讨论】:

  • 如果您要求替代方案:上下文是什么?

标签: java spring static annotations


【解决方案1】:

以下代码对我有用,

public class MappingUtils {

  private static String productTypeList;

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

【讨论】:

    【解决方案2】:

    使用这个简单的技巧来实现您想要的(比将值注入非静态设置器并编写静态字段更好 - 正如接受的答案中所建议的那样):

    @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();

    【讨论】:

    • 赞成 OP 问题的食物解决方案(鉴于需要静态上下文)。但是我不会称之为“技巧”,而是提到模式的名称:Singleton:en.wikipedia.org/wiki/Singleton_pattern
    • NullPointException 被抛出,因为当我测试此代码时INSTANCE 为空。我怀疑ConfigUtil 需要自己注入才能使@PostConstruct 工作(哪种破坏了使用静态方法的目的)
    • @jack3694078 我也得到了 NullPointException
    【解决方案3】:

    为了防止在经常实例化的类中重复注入相同的值使字段成为非静态字段,我更喜欢创建一个简单的 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;
        }
    }
    

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

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

    【讨论】:

    • 我试过了,但它不起作用(当然,因为您使用new 运算符构造了ConfigUtil
    • 没错,即使用@configurable注解也行不通。
    【解决方案4】:

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

    所以你有两种选择:

    • (更好的)使字段非静态
    • (丑陋的 hack)添加一个写入静态字段的非静态设置器,并将 @Value 注释添加到设置器。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2013-03-26
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2016-06-21
    • 2014-11-05
    相关资源
    最近更新 更多