[SCB-2253] reduce invoke setter when configuration changed for @InjectProperties
diff --git a/core/src/main/java/org/apache/servicecomb/core/exception/DefaultExceptionProcessor.java b/core/src/main/java/org/apache/servicecomb/core/exception/DefaultExceptionProcessor.java
index 724e8b0..e18f5e8 100644
--- a/core/src/main/java/org/apache/servicecomb/core/exception/DefaultExceptionProcessor.java
+++ b/core/src/main/java/org/apache/servicecomb/core/exception/DefaultExceptionProcessor.java
@@ -48,6 +48,8 @@
 import org.springframework.beans.factory.annotation.Autowired;

 import org.springframework.stereotype.Component;

 

+import com.fasterxml.jackson.annotation.JsonIgnore;

+

 @Component

 @InjectProperties(prefix = "servicecomb.invocation.exception")

 public class DefaultExceptionProcessor implements ExceptionProcessor {

@@ -55,6 +57,7 @@
 

   public static final int ORDER = Integer.MAX_VALUE;

 

+  @JsonIgnore

   @SuppressWarnings("unchecked")

   private final List<ExceptionConverter<Throwable>> converters = SPIServiceUtils

       .getOrLoadSortedService(ExceptionConverter.class).stream()

diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectProperty.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectProperty.java
index 7231999..e81465b 100644
--- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectProperty.java
+++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectProperty.java
@@ -17,6 +17,8 @@
 

 package org.apache.servicecomb.config.priority;

 

+import javax.annotation.Nullable;

+

 import org.apache.servicecomb.foundation.common.utils.bean.Setter;

 

 /**

@@ -32,7 +34,9 @@
     this.property = property;

   }

 

-  public void updateValue(Object instance) {

-    setter.set(instance, property.getValue());

+  public void updateValueWhenChanged(Object instance, @Nullable String changedKey) {

+    if (property.isChangedKey(changedKey)) {

+      setter.set(instance, property.getValue());

+    }

   }

 }

diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityProperty.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityProperty.java
index faad071..3af93c8 100644
--- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityProperty.java
+++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityProperty.java
@@ -180,4 +180,19 @@
   public T getValue() {
     return finalValue;
   }
+
+  public boolean isChangedKey(String changedKey) {
+    if (changedKey == null) {
+      // property source changed or clear, and so on
+      return true;
+    }
+
+    for (DynamicProperty property : properties) {
+      if (changedKey.equals(property.getName())) {
+        return true;
+      }
+    }
+    
+    return false;
+  }
 }
diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java
index 7cf6eaf..15a1b5b 100644
--- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java
+++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java
@@ -63,10 +63,12 @@
       return;
     }
 
-    // just update all properties, it's very fast, no need to do any optimize
+    // just loop all properties, it's very fast, no need to do any optimize
     for (Entry<Object, List<ConfigObjectProperty>> entry : configObjectMap.entrySet()) {
       Object instance = entry.getKey();
-      entry.getValue().forEach(configObjectProperty -> configObjectProperty.updateValue(instance));
+      entry.getValue()
+          .forEach(
+              configObjectProperty -> configObjectProperty.updateValueWhenChanged(instance, event.getPropertyName()));
     }
   }