From 27d2433993abd4ae3d55bb3e6cecda88f7dc7ba3 Mon Sep 17 00:00:00 2001 From: Redkale Date: Tue, 5 Jul 2022 14:34:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ResourceListener.different?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/redkale/util/ResourceFactory.java | 14 +++++++++++--- .../java/org/redkale/util/ResourceListener.java | 17 +++++++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/redkale/util/ResourceFactory.java b/src/main/java/org/redkale/util/ResourceFactory.java index 4430b87f7..645b14705 100644 --- a/src/main/java/org/redkale/util/ResourceFactory.java +++ b/src/main/java/org/redkale/util/ResourceFactory.java @@ -10,6 +10,7 @@ import java.lang.ref.WeakReference; import java.lang.reflect.*; import java.util.*; import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.*; import java.util.logging.*; import javax.annotation.Resource; @@ -847,7 +848,9 @@ public final class ResourceFactory { } if (element.listener != null) { try { - element.listener.invoke(dest, name, rs, oldVal); + if (!element.different || !Objects.equals(rs, oldVal)) { + element.listener.invoke(dest, name, rs, oldVal); + } } catch (Exception e) { logger.log(Level.SEVERE, dest + " resource change listener error", e); } @@ -869,16 +872,20 @@ public final class ResourceFactory { public final Method listener; + public final boolean different; + public ResourceElement(T dest, Field field) { this.dest = new WeakReference(dest); this.field = field; this.fieldType = field.getType(); Class t = dest.getClass(); String tn = t.getName(); - this.listener = tn.startsWith("java.") || tn.startsWith("javax.") ? null : findListener(t, field.getType()); + AtomicBoolean diff = new AtomicBoolean(); + this.listener = tn.startsWith("java.") || tn.startsWith("javax.") ? null : findListener(t, field.getType(), diff); + this.different = diff.get(); } - private static Method findListener(Class clazz, Class fieldType) { + private static Method findListener(Class clazz, Class fieldType, AtomicBoolean diff) { synchronized (listenerMethods) { Class loop = clazz; Method m = listenerMethods.get(clazz.getName() + "-" + fieldType.getName()); @@ -893,6 +900,7 @@ public final class ResourceFactory { && method.getParameterTypes()[1].isAssignableFrom(fieldType)) { m = method; m.setAccessible(true); + diff.set(method.getAnnotation(ResourceListener.class).different()); RedkaleClassLoader.putReflectionMethod(loop.getName(), method); break; } diff --git a/src/main/java/org/redkale/util/ResourceListener.java b/src/main/java/org/redkale/util/ResourceListener.java index e559baf0a..c9e771c02 100644 --- a/src/main/java/org/redkale/util/ResourceListener.java +++ b/src/main/java/org/redkale/util/ResourceListener.java @@ -29,13 +29,13 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; * * public static void main(String[] args) throws Exception { * ResourceFactory factory = ResourceFactory.root(); - * factory.register("record.id", "2345"); - * factory.register("record.name", "my old name"); + * factory.register("record.id", "2345"); + * factory.register("record.name", "my old name"); * Record record = new Record(); * factory.inject(record); - * factory.register("record.name", "my new name"); + * factory.register("record.name", "my new name"); * } - * + * * } * * @@ -49,4 +49,13 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; @Retention(RUNTIME) public @interface ResourceListener { + /** + * 新旧值是否不同时才回调方法
+ * true: 新值与旧值不同时才回调ResourceListener方法 + * false: 只要执行了ResourceFactory.register 就回调ResourceListener方法 + * + * @since 2.7.0 + * @return boolean + */ + boolean different() default true; }