首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向静态字段注入值

向静态字段注入值
EN

Stack Overflow用户
提问于 2021-04-09 03:21:24
回答 3查看 56关注 0票数 0

下面是我的类:

代码语言:javascript
复制
 public class DeduplicationErrorMetric extends AbstractErrorMetric {
    
        public static final String DEDUPLICATIONS_METRIC = "deduplications";
        public static final String KAFKA_MESSAGES_METRIC = "kafka.messages";
    
        private static String DEDUPLICATION_TOPIC_NAME;
    
        private static final List<Tag> DEDUPLICATION_ERROR_TAGS = List.of(Tag.of("type", "failed"));
        private static final List<Tag> KAFKA_ERROR_TAGS = List.of(Tag.of("topic", DEDUPLICATION_TOPIC_NAME),
                Tag.of("action", "send"), Tag.of("result", "failure"));
    
        public DeduplicationErrorMetric() {
            super(Map.of(
                    DEDUPLICATIONS_METRIC, DEDUPLICATION_ERROR_TAGS,
                    KAFKA_MESSAGES_METRIC, KAFKA_ERROR_TAGS
            ));
        }
    
        @Override
        public void incrementMetric(String key) {
            errorCounters.get(key).increment();
        }
    }

我的application.yml中有@Value("${kafka.topic.deduplication}"),需要在创建bean之前将值插入到DEDUPLICATION_TOPIC_NAME中。我该怎么做呢?

EN

回答 3

Stack Overflow用户

发布于 2021-04-09 03:37:02

您可以使用setter来完成此操作,但我主张使用来反对这种做法,

  1. 这意味着您的字段将在第一个实例出现并调用此注入点之前为null
  2. 您的static字段为final,因此可能导致修改,从而导致难以调试的错误
  3. 它不会解决您当前的问题,因为在本例中将为KAFKA_ERROR_TAGS

使用null

代码语言:javascript
复制
@Value("${kafka.topic.deduplication}")
private void setDeduplicationTopicName(String deduplicationTopicName) {
    this.DEDUPLICATION_TOPIC_NAME = deducplicationTopicName;
}

相反,可以尝试创建一个@Singleton bean并在其字段上使用@Value,这样就可以确保只有一个实例。

对于您的列表,您可以使用@PostConstruct来确保它被实例化一次

票数 1
EN

Stack Overflow用户

发布于 2021-04-09 05:59:43

在这里,您可以直接使用属性文件中的注入。

如果它是一个SpringBoot应用程序,在你的应用程序属性中设置你的kafka.topic.deduplication属性(你可以根据不同的环境设置不同的值)。

这样,Spring将在构造bean时获得该值。

您的代码可能如下所示:

代码语言:javascript
复制
public class DeduplicationErrorMetric extends AbstractErrorMetric {

    public static final String DEDUPLICATIONS_METRIC = "deduplications";
    public static final String KAFKA_MESSAGES_METRIC = "kafka.messages";

    private static final List<Tag> DEDUPLICATION_ERROR_TAGS = List.of(Tag.of("type", "failed"));
    private static final List<Tag> KAFKA_ERROR_TAGS = List.of(Tag.of("topic", deduplicationTopicName),
            Tag.of("action", "send"), Tag.of("result", "failure"));

    @Value("${kafka.topic.deduplication}")
    private String deduplicationTopicName; 
   
    public DeduplicationErrorMetric() {
        super(Map.of(
                DEDUPLICATIONS_METRIC, DEDUPLICATION_ERROR_TAGS,
                KAFKA_MESSAGES_METRIC, KAFKA_ERROR_TAGS
        ));
    }

    @Override
    public void incrementMetric(String key) {
        errorCounters.get(key).increment();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-04-09 03:32:28

移除关键字"static“,然后您就可以在实例中更改它。

静态表示字段已锁定到类。

代码语言:javascript
复制
public class DeduplicationErrorMetric extends AbstractErrorMetric {
    
    public static final String DEDUPLICATIONS_METRIC = "deduplications";
    public static final String KAFKA_MESSAGES_METRIC = "kafka.messages";
    
    private String DEDUPLICATION_TOPIC_NAME;
    
    private static final List<Tag> DEDUPLICATION_ERROR_TAGS = List.of(Tag.of("type", "failed"));
    private List<Tag> KAFKA_ERROR_TAGS = List.of(Tag.of("topic", DEDUPLICATION_TOPIC_NAME),
            Tag.of("action", "send"), Tag.of("result", "failure"));
    
    public DeduplicationErrorMetric() {
        super(Map.of(
                DEDUPLICATIONS_METRIC, DEDUPLICATION_ERROR_TAGS,
                KAFKA_MESSAGES_METRIC, KAFKA_ERROR_TAGS
        ));
    }
    
    @Override
    public void incrementMetric(String key) {
        errorCounters.get(key).increment();
    }
    
    public void setTopic(String value){
        DEDUPLICATION_TOPIC_NAME = value;   
    }
}

private void example(){
    DeduplicationErrorMetric dem = new DeduplicationErrorMetric();
    
    //Set the instance value directly
    dem.DEDUPLICATION_TOPIC_NAME = "Test";
    
    //Set via a function, potentially with other variables. 
    demo.setTopic("Test");
}

我还建议将变量名设置为小写,因为它不是静态的,这是很好的编码实践。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67010567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档