java—将值注入静态字段

nuypyhwy  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(374)

这是我的课:

  1. public class DeduplicationErrorMetric extends AbstractErrorMetric {
  2. public static final String DEDUPLICATIONS_METRIC = "deduplications";
  3. public static final String KAFKA_MESSAGES_METRIC = "kafka.messages";
  4. private static String DEDUPLICATION_TOPIC_NAME;
  5. private static final List<Tag> DEDUPLICATION_ERROR_TAGS = List.of(Tag.of("type", "failed"));
  6. private static final List<Tag> KAFKA_ERROR_TAGS = List.of(Tag.of("topic", DEDUPLICATION_TOPIC_NAME),
  7. Tag.of("action", "send"), Tag.of("result", "failure"));
  8. public DeduplicationErrorMetric() {
  9. super(Map.of(
  10. DEDUPLICATIONS_METRIC, DEDUPLICATION_ERROR_TAGS,
  11. KAFKA_MESSAGES_METRIC, KAFKA_ERROR_TAGS
  12. ));
  13. }
  14. @Override
  15. public void incrementMetric(String key) {
  16. errorCounters.get(key).increment();
  17. }
  18. }

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

ttygqcqt

ttygqcqt1#

你可以用setter来做这件事,但我反对这种做法!
这意味着你的领域 null 在第一个示例到来并调用这个注入点之前
你的 static 字段不是 final 因此可能导致修改,从而导致难以调试的bug
它不能解决你现在的问题 null 在这种情况下,值将用于 KAFKA_ERROR_TAGS ```
@Value("${kafka.topic.deduplication}")
private void setDeduplicationTopicName(String deduplicationTopicName) {
this.DEDUPLICATION_TOPIC_NAME = deducplicationTopicName;
}

  1. 相反,也许可以试着创造一个 `@Singleton` 豆与用 `@Value` 在它的字段上,那么您确定只有一个示例。
  2. 对于您的列表,您可以使用 `@PostConstruct` 确保示例化一次
2jcobegt

2jcobegt2#

这里可以直接使用属性文件中的注入。
如果它是一个springboot应用程序,那么在应用程序属性中设置 kafka.topic.deduplication 属性(对于不同的环境可以有不同的值)。
这样,spring将在构造bean时获得值。
您的代码可能如下所示:

  1. public class DeduplicationErrorMetric extends AbstractErrorMetric {
  2. public static final String DEDUPLICATIONS_METRIC = "deduplications";
  3. public static final String KAFKA_MESSAGES_METRIC = "kafka.messages";
  4. private static final List<Tag> DEDUPLICATION_ERROR_TAGS = List.of(Tag.of("type", "failed"));
  5. private static final List<Tag> KAFKA_ERROR_TAGS = List.of(Tag.of("topic", deduplicationTopicName),
  6. Tag.of("action", "send"), Tag.of("result", "failure"));
  7. @Value("${kafka.topic.deduplication}")
  8. private String deduplicationTopicName;
  9. public DeduplicationErrorMetric() {
  10. super(Map.of(
  11. DEDUPLICATIONS_METRIC, DEDUPLICATION_ERROR_TAGS,
  12. KAFKA_MESSAGES_METRIC, KAFKA_ERROR_TAGS
  13. ));
  14. }
  15. @Override
  16. public void incrementMetric(String key) {
  17. errorCounters.get(key).increment();
  18. }
  19. }
展开查看全部
luaexgnf

luaexgnf3#

删除关键字“static”,然后您就可以在示例中更改它了。
静态意味着字段被锁定到类。

  1. public class DeduplicationErrorMetric extends AbstractErrorMetric {
  2. public static final String DEDUPLICATIONS_METRIC = "deduplications";
  3. public static final String KAFKA_MESSAGES_METRIC = "kafka.messages";
  4. private String DEDUPLICATION_TOPIC_NAME;
  5. private static final List<Tag> DEDUPLICATION_ERROR_TAGS = List.of(Tag.of("type", "failed"));
  6. private List<Tag> KAFKA_ERROR_TAGS = List.of(Tag.of("topic", DEDUPLICATION_TOPIC_NAME),
  7. Tag.of("action", "send"), Tag.of("result", "failure"));
  8. public DeduplicationErrorMetric() {
  9. super(Map.of(
  10. DEDUPLICATIONS_METRIC, DEDUPLICATION_ERROR_TAGS,
  11. KAFKA_MESSAGES_METRIC, KAFKA_ERROR_TAGS
  12. ));
  13. }
  14. @Override
  15. public void incrementMetric(String key) {
  16. errorCounters.get(key).increment();
  17. }
  18. public void setTopic(String value){
  19. DEDUPLICATION_TOPIC_NAME = value;
  20. }
  21. }
  22. private void example(){
  23. DeduplicationErrorMetric dem = new DeduplicationErrorMetric();
  24. //Set the instance value directly
  25. dem.DEDUPLICATION_TOPIC_NAME = "Test";
  26. //Set via a function, potentially with other variables.
  27. demo.setTopic("Test");
  28. }

由于变量名不是静态的,因此我还建议将其设置为小写,这是一种良好的编码实践。

展开查看全部

相关问题