From 0c60700d829808cfebc3ec33a326f6a506f5185b Mon Sep 17 00:00:00 2001 From: Redkale Date: Wed, 6 Jul 2022 22:44:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ResourceEvent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/redkale/util/ResourceEvent.java | 20 ++++++++ .../org/redkale/util/ResourceFactory.java | 50 ++++++++++++++++--- .../org/redkale/util/ResourceListener.java | 8 +-- .../org/redkale/test/util/ResourceTest.java | 18 +++++-- 4 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 src/main/java/org/redkale/util/ResourceEvent.java diff --git a/src/main/java/org/redkale/util/ResourceEvent.java b/src/main/java/org/redkale/util/ResourceEvent.java new file mode 100644 index 000000000..b7beca2dc --- /dev/null +++ b/src/main/java/org/redkale/util/ResourceEvent.java @@ -0,0 +1,20 @@ +/* + */ +package org.redkale.util; + +/** + * 详情见: https://redkale.org + * + * @param 泛型 + * + * @author zhangjx + * @since 2.7.0 + */ +public interface ResourceEvent { + + public String name(); + + public T newValue(); + + public T oldValue(); +} diff --git a/src/main/java/org/redkale/util/ResourceFactory.java b/src/main/java/org/redkale/util/ResourceFactory.java index 99815bf05..9e95ffe65 100644 --- a/src/main/java/org/redkale/util/ResourceFactory.java +++ b/src/main/java/org/redkale/util/ResourceFactory.java @@ -853,7 +853,8 @@ public final class ResourceFactory { if (element.listener != null) { try { if (!element.different || !Objects.equals(newVal, oldVal)) { - element.listener.invoke(dest, name, newVal, oldVal); + Object[] ps = new Object[]{new ResourceEvent[]{new ResourceChangeEvent(name, newVal, oldVal)}}; + element.listener.invoke(dest, ps); } } catch (Exception e) { logger.log(Level.SEVERE, dest + " resource change listener error", e); @@ -897,16 +898,16 @@ public final class ResourceFactory { do { RedkaleClassLoader.putReflectionDeclaredMethods(loop.getName()); for (Method method : loop.getDeclaredMethods()) { - if (method.getAnnotation(ResourceListener.class) != null - && method.getParameterCount() == 3 - && String.class.isAssignableFrom(method.getParameterTypes()[0]) - && method.getParameterTypes()[1] == method.getParameterTypes()[2] - && method.getParameterTypes()[1].isAssignableFrom(fieldType)) { + ResourceListener rl = method.getAnnotation(ResourceListener.class); + if (rl == null) continue; + if (method.getParameterCount() == 1 && method.getParameterTypes()[0] == ResourceEvent[].class) { m = method; m.setAccessible(true); - diff.set(method.getAnnotation(ResourceListener.class).different()); + diff.set(rl.different()); RedkaleClassLoader.putReflectionMethod(loop.getName(), method); break; + } else { + System.err.println("@" + ResourceListener.class.getSimpleName() + " must on method with " + ResourceEvent.class.getSimpleName() + "[] parameter type"); } } } while ((loop = loop.getSuperclass()) != Object.class); @@ -916,6 +917,41 @@ public final class ResourceFactory { } } + private static class ResourceChangeEvent implements ResourceEvent { + + public String name; + + public T newValue; + + public T oldValue; + + public ResourceChangeEvent(String name, T newValue, T oldValue) { + this.name = name; + this.newValue = newValue; + this.oldValue = oldValue; + } + + @Override + public String name() { + return name; + } + + @Override + public T newValue() { + return newValue; + } + + @Override + public T oldValue() { + return oldValue; + } + + @Override + public String toString() { + return "{name = " + name() + ", newValue = " + newValue() + ", oldValue = " + oldValue() + "}"; + } + } + // public static class SimpleResourceTypeLoader implements ResourceTypeLoader { // // protected Class type; diff --git a/src/main/java/org/redkale/util/ResourceListener.java b/src/main/java/org/redkale/util/ResourceListener.java index c9e771c02..ff03934b7 100644 --- a/src/main/java/org/redkale/util/ResourceListener.java +++ b/src/main/java/org/redkale/util/ResourceListener.java @@ -10,7 +10,7 @@ import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** - * @Resource资源被更新时的监听事件。本注解只能标记在方法参数为(String name, T newVal, T oldVal)上。 + * @Resource资源被更新时的监听事件。本注解只能标记在方法参数为ResourceEvent[]上。 * 方法在资源被更新以后调用。 * *
@@ -23,8 +23,10 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  *    private String name;
  *
  *    @ResourceListener
- *    private void changeResource(String name, Object newVal, Object oldVal) {
- *        System.out.println("@Resource = " + name + " 资源变更:  newVal = " + newVal + ", oldVal = " + oldVal);
+ *    private void changeResource(ResourceEvent[] events) {
+ *        for(ResourceEvent event : events) {  
+ *            System.out.println("@Resource = " + event.name() + " 资源变更:  newVal = " + event.newValue() + ", oldVal = " + event.oldValue());
+ *        }
  *    }
  *
  *    public static void main(String[] args) throws Exception {
diff --git a/src/test/java/org/redkale/test/util/ResourceTest.java b/src/test/java/org/redkale/test/util/ResourceTest.java
index 69a5cae06..efcdf0cfb 100644
--- a/src/test/java/org/redkale/test/util/ResourceTest.java
+++ b/src/test/java/org/redkale/test/util/ResourceTest.java
@@ -7,6 +7,7 @@ package org.redkale.test.util;
 
 import java.math.*;
 import javax.annotation.*;
+import org.junit.jupiter.api.Test;
 import org.redkale.util.*;
 
 /**
@@ -15,7 +16,16 @@ import org.redkale.util.*;
  */
 public class ResourceTest {
 
-    public static void main(String[] args) throws Exception {
+    private boolean main;
+
+    public static void main(String[] args) throws Throwable {
+        ResourceTest test = new ResourceTest();
+        test.main = true;
+        test.run();
+    }
+
+    @Test
+    public void run() throws Exception {
         ResourceFactory factory = ResourceFactory.create();
         factory.register("property.id", "2345"); //注入String类型的property.id
         AService aservice = new AService();
@@ -58,8 +68,10 @@ class BService {
     private String name = "";
 
     @ResourceListener
-    private void changeResource(String name, Object newVal, Object oldVal) {
-        System.out.println("@Resource = " + name + " 资源变更:  newVal = " + newVal + ", oldVal = " + oldVal);
+    private void changeResource(ResourceEvent[] events) {
+        for (ResourceEvent event : events) {
+            System.out.println("@Resource = " + event.name() + " 资源变更:  newVal = " + event.newValue() + ", oldVal = " + event.oldValue());
+        }
     }
 
     @ConstructorParameters({"name"})