增加ResourceListener.different功能

This commit is contained in:
Redkale
2022-07-05 14:34:59 +08:00
parent 64eda4cdf7
commit 27d2433993
2 changed files with 24 additions and 7 deletions

View File

@@ -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;
}

View File

@@ -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");
* }
*
*
* }
* </pre></blockquote>
*
@@ -49,4 +49,13 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Retention(RUNTIME)
public @interface ResourceListener {
/**
* 新旧值是否不同时才回调方法 <br>
* true: 新值与旧值不同时才回调ResourceListener方法
* false: 只要执行了ResourceFactory.register 就回调ResourceListener方法
*
* @since 2.7.0
* @return boolean
*/
boolean different() default true;
}