From 24a043195a72b35a9f1f5a77652e19b5e49d4329 Mon Sep 17 00:00:00 2001 From: redkale Date: Tue, 19 Dec 2023 09:53:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ResourceInjected=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...urceListener.java => ResourceChanged.java} | 35 +++--- .../redkale/annotation/ResourceInjected.java | 63 +++++++++++ .../redkale/cluster/CacheClusterAgent.java | 4 +- .../org/redkale/cluster/ClusterAgent.java | 4 +- .../org/redkale/inject/ResourceFactory.java | 102 +++++++++++++----- .../java/org/redkale/mq/MessageAgent.java | 4 +- src/main/java/org/redkale/net/sncp/Sncp.java | 2 +- .../redkale/source/AbstractCacheSource.java | 4 +- .../redkale/source/AbstractDataSource.java | 4 +- .../redkale/source/AbstractDataSqlSource.java | 4 +- .../org/redkale/source/CacheMemorySource.java | 4 +- .../org/redkale/source/DataJdbcSource.java | 4 +- .../org/redkale/source/DataMemorySource.java | 4 +- .../java/org/redkale/util/Environment.java | 2 +- .../org/redkale/util/ResourceListener.java | 6 +- .../ResourceAnnotationTest.java | 2 +- .../test/inject/ResourceInjectedTest.java | 68 ++++++++++++ .../ResourceListenerTest.java | 10 +- .../{util => inject}/ResourceLoaderTest.java | 2 +- .../test/{util => inject}/ResourceTest.java | 4 +- 20 files changed, 257 insertions(+), 75 deletions(-) rename src/main/java/org/redkale/annotation/{ResourceListener.java => ResourceChanged.java} (56%) create mode 100644 src/main/java/org/redkale/annotation/ResourceInjected.java rename src/test/java/org/redkale/test/{util => inject}/ResourceAnnotationTest.java (98%) create mode 100644 src/test/java/org/redkale/test/inject/ResourceInjectedTest.java rename src/test/java/org/redkale/test/{util => inject}/ResourceListenerTest.java (93%) rename src/test/java/org/redkale/test/{util => inject}/ResourceLoaderTest.java (94%) rename src/test/java/org/redkale/test/{util => inject}/ResourceTest.java (99%) diff --git a/src/main/java/org/redkale/annotation/ResourceListener.java b/src/main/java/org/redkale/annotation/ResourceChanged.java similarity index 56% rename from src/main/java/org/redkale/annotation/ResourceListener.java rename to src/main/java/org/redkale/annotation/ResourceChanged.java index 68d51d4ef..1cd0076d5 100644 --- a/src/main/java/org/redkale/annotation/ResourceListener.java +++ b/src/main/java/org/redkale/annotation/ResourceChanged.java @@ -11,7 +11,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * @Resource资源被更新时的监听事件, 本注解只能标记在方法参数为ResourceEvent[]上
- * 注意: 一个类只能存在一个@ResourceListener的方法, 多余的会被忽略
+ * 注意: 一个类只能存在一个@ResourceChanged的方法, 多余的会被忽略
* 方法在资源被更新以后调用。 * *
@@ -23,22 +23,21 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
  *    @Resource(name = "record.name")
  *    private String name;
  *
- *    @ResourceListener
+ *    @ResourceChanged
  *    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 {
- *        ResourceFactory factory = ResourceFactory.root();
- *        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");
- *   }
+ *      for(ResourceEvent event : events) {
+ *          System.out .println("@Resource = " + event.name() + " 资源变更:  newVal = " + event.newValue() + ", oldVal = " + event.oldValue());
+ *      }
+ *  }
  *
+ *  public static void main(String[] args) throws Exception {
+ *      ResourceFactory factory = ResourceFactory.create();
+ *      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");
+ *  }
  * }
  * 
* @@ -50,12 +49,12 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; @Documented @Target({METHOD}) @Retention(RUNTIME) -public @interface ResourceListener { +public @interface ResourceChanged { /** * 新旧值是否不同时才回调方法
- * true: 新值与旧值不同时才回调ResourceListener方法 - * false: 只要执行了ResourceFactory.register 就回调ResourceListener方法 + * true: 新值与旧值不同时才回调ResourceChanged方法 + * false: 只要执行了ResourceFactory.register 就回调ResourceChanged方法 * * @since 2.7.0 * @return boolean diff --git a/src/main/java/org/redkale/annotation/ResourceInjected.java b/src/main/java/org/redkale/annotation/ResourceInjected.java new file mode 100644 index 000000000..87c697e43 --- /dev/null +++ b/src/main/java/org/redkale/annotation/ResourceInjected.java @@ -0,0 +1,63 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.annotation; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * @Resource资源被依赖注入时的监听事件。
+ * 本注解只能标记在空参数或者(String、Object、java.lang.reflect.Field)三个参数类型的任意组合方法上
+ * 方法在资源被依赖注入后调用。 + * + *
+ * public class ResourceService implements Service {
+ *
+ *    @Resource(name = "res.id")
+ *    private int id;
+ *
+ *    @Resource(name = "res.name")
+ *    private String name;
+ *
+ *    @ResourceInjected
+ *    private void onInjected(Object src, String fieldName) {
+ *       System.out .println("资源被注入到对象(" + src + ")的字段(" + fieldName + ")上");
+ *  }
+ * }
+ *
+ * public class RecordService implements Service {
+ *
+ *    @Resource
+ *    private ResourceService resService;
+ *
+ *    public void test() {
+ *  }
+ *
+ *  public static void main(String[] args) throws Exception {
+ *      ResourceFactory factory = ResourceFactory.create();
+ *      factory.register("res.id", "2345");
+ *      factory.register("res.name", "my old name");
+ *      ResourceService res = new ResourceService();
+ *      factory.inject(res);
+ *      factory.register("", res);
+ *      RecordService serice = new RecordService();
+ *      factory.inject(record);
+ *  }
+ * }
+ * 
+ * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + */ +@Documented +@Target({METHOD}) +@Retention(RUNTIME) +public @interface ResourceInjected { + +} diff --git a/src/main/java/org/redkale/cluster/CacheClusterAgent.java b/src/main/java/org/redkale/cluster/CacheClusterAgent.java index 4b30829ee..c9de15d1a 100644 --- a/src/main/java/org/redkale/cluster/CacheClusterAgent.java +++ b/src/main/java/org/redkale/cluster/CacheClusterAgent.java @@ -11,7 +11,6 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.logging.Level; import org.redkale.annotation.*; -import org.redkale.annotation.ResourceListener; import org.redkale.boot.*; import org.redkale.convert.json.JsonConvert; import org.redkale.inject.Resourcable; @@ -19,6 +18,7 @@ import org.redkale.inject.ResourceEvent; import org.redkale.service.Service; import org.redkale.source.CacheSource; import org.redkale.util.*; +import org.redkale.annotation.ResourceChanged; /** * 使用CacheSource实现的第三方服务发现管理接口cluster @@ -60,7 +60,7 @@ public class CacheClusterAgent extends ClusterAgent implements Resourcable { } @Override - @ResourceListener + @ResourceChanged public void onResourceChange(ResourceEvent[] events) { StringBuilder sb = new StringBuilder(); int newTtls = this.ttls; diff --git a/src/main/java/org/redkale/cluster/ClusterAgent.java b/src/main/java/org/redkale/cluster/ClusterAgent.java index 1d08ca927..9b5b6777c 100644 --- a/src/main/java/org/redkale/cluster/ClusterAgent.java +++ b/src/main/java/org/redkale/cluster/ClusterAgent.java @@ -13,7 +13,6 @@ import java.util.concurrent.*; import java.util.logging.*; import org.redkale.annotation.*; import org.redkale.annotation.AutoLoad; -import org.redkale.annotation.ResourceListener; import org.redkale.boot.*; import static org.redkale.boot.Application.*; import org.redkale.convert.ConvertDisabled; @@ -24,6 +23,7 @@ import org.redkale.net.http.*; import org.redkale.net.sncp.*; import org.redkale.service.*; import org.redkale.util.*; +import org.redkale.annotation.ResourceChanged; /** * 服务注册中心管理类cluster @@ -103,7 +103,7 @@ public abstract class ClusterAgent { } } - @ResourceListener + @ResourceChanged public abstract void onResourceChange(ResourceEvent[] events); public void destroy(AnyValue config) { diff --git a/src/main/java/org/redkale/inject/ResourceFactory.java b/src/main/java/org/redkale/inject/ResourceFactory.java index a9284f4fb..ebc75f6ef 100644 --- a/src/main/java/org/redkale/inject/ResourceFactory.java +++ b/src/main/java/org/redkale/inject/ResourceFactory.java @@ -114,10 +114,16 @@ public final class ResourceFactory { this.store.clear(); } + /** + * inject时的锁 + */ public void lock() { lock.lock(); } + /** + * inject时的锁 + */ public void unlock() { lock.unlock(); } @@ -139,6 +145,13 @@ public final class ResourceFactory { } } + /** + * 获取资源的注入类型,class存在ResourceType注解的优先用ResourceType.value, 没有则使用type本身的class + * + * @param type 资源类型 + * + * @return 注入的Type + */ public static Class getResourceType(Type type) { Class clazz = TypeToken.typeToClass(type); ResourceType rt = clazz.getAnnotation(ResourceType.class); @@ -201,7 +214,7 @@ public final class ResourceFactory { if (rs == null) { return null; } - return (A) register(autoSync, "", rs); + return register(autoSync, "", rs); } /** @@ -494,8 +507,8 @@ public final class ResourceFactory { if (entry != null && entry.elements != null) { for (ResourceElement element : entry.elements) { Object dest = element.dest.get(); - if (dest != null && element.listener != null) { - envListenMap.put(dest, element.listener); + if (dest != null && element.changedMethod != null) { + envListenMap.put(dest, element.changedMethod); } } } @@ -512,7 +525,7 @@ public final class ResourceFactory { if (envListenMap.containsKey(dest)) { return; //跳过含有@Resource Environment字段的对象 } - Method listener = list.get(0).listener; + Method listener = list.get(0).method; try { ResourceEvent[] events = new ResourceEvent[list.size()]; for (int i = 0; i < list.size(); i++) { @@ -618,7 +631,10 @@ public final class ResourceFactory { */ public boolean contains(boolean recursive, String name, Class clazz) { Map map = this.store.get(clazz); - return map == null ? ((recursive && parent != null) ? parent.contains(recursive, name, clazz) : false) : map.containsKey(name); + if (map != null) { + return map.containsKey(name); + } + return recursive && parent != null && parent.contains(recursive, name, clazz); } /** @@ -1009,6 +1025,7 @@ public final class ResourceFactory { } if (rs != null) { field.set(srcObj, rs); + onResourceInjected(srcObj, field, rs); } if (rs == null && rc1 != null && rc1.required()) { String t = srcObj.getClass().getName(); @@ -1050,6 +1067,11 @@ public final class ResourceFactory { return parent == null ? null : parent.findResourceTypeLoader(clazz); } + public ResourceTypeLoader findTypeLoader(Type ft, Field field) { + ResourceTypeLoader it = this.findMatchTypeLoader(ft, field); + return it == null ? findRegxTypeLoader(ft, field) : it; + } + private ResourceFactory parentRoot() { if (parent == null) { return this; @@ -1078,16 +1100,46 @@ public final class ResourceFactory { if (t == ft) { return en.getValue(); } - if (t instanceof Class && (((Class) t)).isAssignableFrom(c)) { + if (t instanceof Class && ((Class) t).isAssignableFrom(c)) { return en.getValue(); } } return parent == null ? null : parent.findRegxTypeLoader(ft, field); } - public ResourceTypeLoader findTypeLoader(Type ft, Field field) { - ResourceTypeLoader it = this.findMatchTypeLoader(ft, field); - return it == null ? findRegxTypeLoader(ft, field) : it; + private void onResourceInjected(Object src, Field field, Object res) { + if (res == null || res.getClass().isPrimitive() + || res.getClass().getName().startsWith("java.") + || res.getClass().getName().startsWith("javax.")) { + return; + } + for (Method method : res.getClass().getDeclaredMethods()) { + ResourceInjected inj = method.getAnnotation(ResourceInjected.class); + if (inj == null) { + continue; + } + Class[] paramTypes = method.getParameterTypes(); + Object[] params = new Object[paramTypes.length]; + for (int i = 0; i < params.length; i++) { + if (paramTypes[i] == Object.class) { + params[i] = src; + } else if (paramTypes[i] == String.class) { + params[i] = field.getName(); + } else if (paramTypes[i] == Field.class) { + params[i] = field; + } else { + throw new RedkaleException("illegal @" + ResourceInjected.class.getSimpleName() + " on method(" + method.getName() + ")"); + } + } + try { + if (!Modifier.isPublic(method.getModifiers())) { + method.setAccessible(true); + } + method.invoke(res, params); + } catch (Exception e) { + throw new RedkaleException(e); + } + } } private static class ResourceEntry { @@ -1143,7 +1195,7 @@ public final class ResourceFactory { newVal = Array.get(Creator.newArray(classType, 1), 0); } Object oldVal = null; - if (element.listener != null) { + if (element.changedMethod != null) { try { oldVal = element.field.get(dest); } catch (Throwable e) { @@ -1155,14 +1207,14 @@ public final class ResourceFactory { } catch (Throwable e) { e.printStackTrace(); } - if (element.listener != null) { + if (element.changedMethod != null) { try { if (!element.different || !Objects.equals(newVal, oldVal)) { if (wrappers == null) { Object[] ps = new Object[]{new ResourceEvent[]{ResourceEvent.create(name, newVal, oldVal)}}; - element.listener.invoke(dest, ps); + element.changedMethod.invoke(dest, ps); } else { - wrappers.add(new ResourceChangeWrapper(dest, element.listener, ResourceEvent.create(name, newVal, oldVal))); + wrappers.add(new ResourceChangeWrapper(dest, element.changedMethod, ResourceEvent.create(name, newVal, oldVal))); } } } catch (Throwable e) { @@ -1178,7 +1230,7 @@ public final class ResourceFactory { private static final ReentrantLock syncLock = new ReentrantLock(); - private static final HashMap listenerMethods = new HashMap<>(); //不使用ConcurrentHashMap是因为value不能存null + private static final HashMap changedMethods = new HashMap<>(); //不使用ConcurrentHashMap是因为value不能存null public final WeakReference dest; @@ -1186,7 +1238,7 @@ public final class ResourceFactory { public final Class fieldType; - public final Method listener; + public final Method changedMethod; public final boolean different; @@ -1197,22 +1249,22 @@ public final class ResourceFactory { Class t = dest.getClass(); String tn = t.getName(); AtomicBoolean diff = new AtomicBoolean(); - this.listener = tn.startsWith("java.") || tn.startsWith("javax.") ? null : findListener(t, field.getType(), diff); + this.changedMethod = tn.startsWith("java.") || tn.startsWith("javax.") ? null : findChangedMethod(t, field.getType(), diff); this.different = diff.get(); } - private static Method findListener(Class clazz, Class fieldType, AtomicBoolean diff) { + private static Method findChangedMethod(Class clazz, Class fieldType, AtomicBoolean diff) { syncLock.lock(); try { Class loop = clazz; - Method m = listenerMethods.get(clazz.getName() + "-" + fieldType.getName()); + Method m = changedMethods.get(clazz.getName() + "-" + fieldType.getName()); if (m != null) { return m; } do { RedkaleClassLoader.putReflectionDeclaredMethods(loop.getName()); for (Method method : loop.getDeclaredMethods()) { - ResourceListener rl = method.getAnnotation(ResourceListener.class); + ResourceChanged rl = method.getAnnotation(ResourceChanged.class); org.redkale.util.ResourceListener rl2 = method.getAnnotation(org.redkale.util.ResourceListener.class); if (rl == null && rl2 == null) { continue; @@ -1224,12 +1276,12 @@ public final class ResourceFactory { RedkaleClassLoader.putReflectionMethod(loop.getName(), method); break; } else { - logger.log(Level.SEVERE, "@" + ResourceListener.class.getSimpleName() + logger.log(Level.SEVERE, "@" + ResourceChanged.class.getSimpleName() + " must on method with " + ResourceEvent.class.getSimpleName() + "[] parameter type"); } } } while ((loop = loop.getSuperclass()) != Object.class); - listenerMethods.put(clazz.getName() + "-" + fieldType.getName(), m); + changedMethods.put(clazz.getName() + "-" + fieldType.getName(), m); return m; } finally { syncLock.unlock(); @@ -1241,13 +1293,13 @@ public final class ResourceFactory { public Object dest; - public Method listener; + public Method method; public ResourceEvent event; public ResourceChangeWrapper(Object dest, Method listener, ResourceEvent event) { this.dest = dest; - this.listener = listener; + this.method = listener; this.event = event; } @@ -1259,7 +1311,7 @@ public final class ResourceFactory { public int hashCode() { int hash = 7; hash = 97 * hash + Objects.hashCode(this.dest); - hash = 97 * hash + Objects.hashCode(this.listener); + hash = 97 * hash + Objects.hashCode(this.method); return hash; } @@ -1278,7 +1330,7 @@ public final class ResourceFactory { if (!Objects.equals(this.dest, other.dest)) { return false; } - return Objects.equals(this.listener, other.listener); + return Objects.equals(this.method, other.method); } } diff --git a/src/main/java/org/redkale/mq/MessageAgent.java b/src/main/java/org/redkale/mq/MessageAgent.java index 84b3fdefe..bc215403e 100644 --- a/src/main/java/org/redkale/mq/MessageAgent.java +++ b/src/main/java/org/redkale/mq/MessageAgent.java @@ -16,7 +16,6 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.logging.*; import org.redkale.annotation.*; import org.redkale.annotation.AutoLoad; -import org.redkale.annotation.ResourceListener; import org.redkale.boot.*; import static org.redkale.boot.Application.RESNAME_APP_NAME; import static org.redkale.boot.Application.RESNAME_APP_NODEID; @@ -32,6 +31,7 @@ import org.redkale.net.http.*; import org.redkale.net.sncp.*; import org.redkale.service.*; import org.redkale.util.*; +import org.redkale.annotation.ResourceChanged; /** * MQ管理器 @@ -392,7 +392,7 @@ public abstract class MessageAgent implements Resourcable { protected abstract MessageClientProducer startMessageClientProducer(); //--------------------------------------------------- - @ResourceListener + @ResourceChanged public abstract void onResourceChange(ResourceEvent[] events); // diff --git a/src/main/java/org/redkale/net/sncp/Sncp.java b/src/main/java/org/redkale/net/sncp/Sncp.java index af889916c..c72bb34da 100644 --- a/src/main/java/org/redkale/net/sncp/Sncp.java +++ b/src/main/java/org/redkale/net/sncp/Sncp.java @@ -99,7 +99,7 @@ public abstract class Sncp { if (method.getAnnotation(Local.class) != null) { continue; } - if (method.getAnnotation(ResourceListener.class) != null) { + if (method.getAnnotation(ResourceChanged.class) != null) { continue; } if (method.getName().equals("getClass") || method.getName().equals("toString")) { diff --git a/src/main/java/org/redkale/source/AbstractCacheSource.java b/src/main/java/org/redkale/source/AbstractCacheSource.java index be8387ce1..651bf6048 100644 --- a/src/main/java/org/redkale/source/AbstractCacheSource.java +++ b/src/main/java/org/redkale/source/AbstractCacheSource.java @@ -4,13 +4,13 @@ package org.redkale.source; import java.util.*; import org.redkale.annotation.AutoLoad; -import org.redkale.annotation.ResourceListener; import org.redkale.annotation.ResourceType; import org.redkale.inject.Resourcable; import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceFactory; import org.redkale.service.*; import org.redkale.util.*; +import org.redkale.annotation.ResourceChanged; /** * CacheSource的S抽象实现类
@@ -54,7 +54,7 @@ public abstract class AbstractCacheSource extends AbstractService implements Cac //@since 2.7.0 public static final String CACHE_SOURCE_PIPELINES = "pipelines"; - @ResourceListener + @ResourceChanged public abstract void onResourceChange(ResourceEvent[] events); //从Properties配置中创建DataSource diff --git a/src/main/java/org/redkale/source/AbstractDataSource.java b/src/main/java/org/redkale/source/AbstractDataSource.java index daa0924ff..6559808f2 100644 --- a/src/main/java/org/redkale/source/AbstractDataSource.java +++ b/src/main/java/org/redkale/source/AbstractDataSource.java @@ -15,7 +15,6 @@ import java.util.stream.Stream; import org.redkale.annotation.*; import org.redkale.annotation.AutoLoad; import org.redkale.annotation.Comment; -import org.redkale.annotation.ResourceListener; import org.redkale.annotation.ResourceType; import static org.redkale.boot.Application.RESNAME_APP_EXECUTOR; import org.redkale.convert.json.JsonConvert; @@ -26,6 +25,7 @@ import org.redkale.persistence.Entity; import org.redkale.service.*; import static org.redkale.source.DataSources.*; import org.redkale.util.*; +import org.redkale.annotation.ResourceChanged; /** * DataSource的S抽象实现类
@@ -69,7 +69,7 @@ public abstract class AbstractDataSource extends AbstractService implements Data return name; } - @ResourceListener + @ResourceChanged public abstract void onResourceChange(ResourceEvent[] events); protected void setSourceExecutor(ExecutorService executor) { diff --git a/src/main/java/org/redkale/source/AbstractDataSqlSource.java b/src/main/java/org/redkale/source/AbstractDataSqlSource.java index 56f120738..10f5e1b0c 100644 --- a/src/main/java/org/redkale/source/AbstractDataSqlSource.java +++ b/src/main/java/org/redkale/source/AbstractDataSqlSource.java @@ -16,7 +16,6 @@ import java.util.logging.*; import java.util.stream.Stream; import org.redkale.annotation.*; import org.redkale.annotation.AutoLoad; -import org.redkale.annotation.ResourceListener; import org.redkale.annotation.ResourceType; import static org.redkale.boot.Application.*; import org.redkale.inject.ResourceEvent; @@ -27,6 +26,7 @@ import static org.redkale.source.DataSources.*; import org.redkale.source.EntityInfo.EntityColumn; import org.redkale.util.*; import static org.redkale.util.Utility.isEmpty; +import org.redkale.annotation.ResourceChanged; /** * DataSource的SQL抽象实现类
@@ -148,7 +148,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement } @Override - @ResourceListener + @ResourceChanged public void onResourceChange(ResourceEvent[] events) { if (events == null || events.length < 1) { return; diff --git a/src/main/java/org/redkale/source/CacheMemorySource.java b/src/main/java/org/redkale/source/CacheMemorySource.java index d177e324a..bc0bee1cf 100644 --- a/src/main/java/org/redkale/source/CacheMemorySource.java +++ b/src/main/java/org/redkale/source/CacheMemorySource.java @@ -19,13 +19,13 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import org.redkale.annotation.*; import org.redkale.annotation.AutoLoad; -import org.redkale.annotation.ResourceListener; import org.redkale.annotation.ResourceType; import org.redkale.convert.*; import org.redkale.convert.json.*; import org.redkale.inject.ResourceEvent; import org.redkale.service.Local; import org.redkale.util.*; +import org.redkale.annotation.ResourceChanged; /** * CacheSource的默认实现--内存缓存 @@ -77,7 +77,7 @@ public final class CacheMemorySource extends AbstractCacheSource { } @Override - @ResourceListener + @ResourceChanged public void onResourceChange(ResourceEvent[] events) { //do nothing } diff --git a/src/main/java/org/redkale/source/DataJdbcSource.java b/src/main/java/org/redkale/source/DataJdbcSource.java index 091b50e90..d84566bb2 100644 --- a/src/main/java/org/redkale/source/DataJdbcSource.java +++ b/src/main/java/org/redkale/source/DataJdbcSource.java @@ -15,12 +15,12 @@ import java.util.logging.Level; import java.util.stream.Stream; import org.redkale.annotation.*; import org.redkale.annotation.AutoLoad; -import org.redkale.annotation.ResourceListener; import org.redkale.annotation.ResourceType; import org.redkale.inject.ResourceEvent; import org.redkale.service.Local; import static org.redkale.source.DataSources.*; import org.redkale.util.*; +import org.redkale.annotation.ResourceChanged; /** * DataSource的JDBC实现类 @@ -2902,7 +2902,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { resetMaxConnection(); } - @ResourceListener + @ResourceChanged public void onResourceChange(ResourceEvent[] events) { int newConnectTimeoutSeconds = this.connectTimeoutSeconds; int newMaxconns = this.maxConns; diff --git a/src/main/java/org/redkale/source/DataMemorySource.java b/src/main/java/org/redkale/source/DataMemorySource.java index 25c157c51..dcb305abb 100644 --- a/src/main/java/org/redkale/source/DataMemorySource.java +++ b/src/main/java/org/redkale/source/DataMemorySource.java @@ -10,11 +10,11 @@ import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; import org.redkale.annotation.AutoLoad; -import org.redkale.annotation.ResourceListener; import org.redkale.annotation.ResourceType; import org.redkale.inject.ResourceEvent; import org.redkale.service.Local; import org.redkale.util.*; +import org.redkale.annotation.ResourceChanged; /** * @@ -47,7 +47,7 @@ public class DataMemorySource extends AbstractDataSource { } @Override - @ResourceListener + @ResourceChanged public void onResourceChange(ResourceEvent[] events) { //do nothing } diff --git a/src/main/java/org/redkale/util/Environment.java b/src/main/java/org/redkale/util/Environment.java index 94f1306f8..c1f1364d5 100644 --- a/src/main/java/org/redkale/util/Environment.java +++ b/src/main/java/org/redkale/util/Environment.java @@ -8,7 +8,7 @@ import java.util.function.*; /** * 环境变量, 只读版Properties * 只存放system.property.、mimetype.property.、redkale.cachesource(.|[)、redkale.datasource(.|[)和其他非redkale.开头的配置项 - * 只有ResourceFactory.register(Properties properties, String environmentName, Class environmentType) 方法才能是Environment的ResourceListener起作用 + * 只有ResourceFactory.register(Properties properties, String environmentName, Class environmentType) 方法才能是Environment的ResourceChanged起作用 * * 详情见: https://redkale.org * diff --git a/src/main/java/org/redkale/util/ResourceListener.java b/src/main/java/org/redkale/util/ResourceListener.java index e25e41d1e..2477e337d 100644 --- a/src/main/java/org/redkale/util/ResourceListener.java +++ b/src/main/java/org/redkale/util/ResourceListener.java @@ -31,7 +31,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; * } * * public static void main(String[] args) throws Exception { - * ResourceFactory factory = ResourceFactory.root(); + * ResourceFactory factory = ResourceFactory.create(); * factory.register("record.id", "2345"); * factory.register("record.name", "my old name"); * Record record = new Record(); @@ -45,10 +45,10 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; *

* 详情见: https://redkale.org * - * @see org.redkale.annotation.ResourceListener + * @see org.redkale.annotation.ResourceChanged * * @author zhangjx - * @deprecated replaced by org.redkale.annotation.ResourceListener + * @deprecated replaced by org.redkale.annotation.ResourceChanged */ @Deprecated(since = "2.8.0") @Documented diff --git a/src/test/java/org/redkale/test/util/ResourceAnnotationTest.java b/src/test/java/org/redkale/test/inject/ResourceAnnotationTest.java similarity index 98% rename from src/test/java/org/redkale/test/util/ResourceAnnotationTest.java rename to src/test/java/org/redkale/test/inject/ResourceAnnotationTest.java index 01038d6de..fb4154945 100644 --- a/src/test/java/org/redkale/test/util/ResourceAnnotationTest.java +++ b/src/test/java/org/redkale/test/inject/ResourceAnnotationTest.java @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package org.redkale.test.util; +package org.redkale.test.inject; import java.io.File; import java.lang.annotation.*; diff --git a/src/test/java/org/redkale/test/inject/ResourceInjectedTest.java b/src/test/java/org/redkale/test/inject/ResourceInjectedTest.java new file mode 100644 index 000000000..8c23f7add --- /dev/null +++ b/src/test/java/org/redkale/test/inject/ResourceInjectedTest.java @@ -0,0 +1,68 @@ +/* + * + */ +package org.redkale.test.inject; + +import java.util.concurrent.atomic.AtomicInteger; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.redkale.annotation.Resource; +import org.redkale.annotation.ResourceInjected; +import org.redkale.inject.ResourceFactory; +import org.redkale.service.Service; + +/** + * + * @author zhangjx + */ +public class ResourceInjectedTest { + + public static void main(String[] args) throws Throwable { + ResourceInjectedTest test = new ResourceInjectedTest(); + test.run(); + } + + @Test + public void run() throws Exception { + ResourceFactory factory = ResourceFactory.create(); + factory.register("res.id", "2345"); + factory.register("res.name", "my old name"); + ResourceService res = new ResourceService(); + factory.inject(res); + factory.register("", res); + RoomService serice = new RoomService(); + factory.inject(serice); + Assertions.assertEquals(1, ResourceService.counter.get()); + } + + public static class RoomService implements Service { + + @Resource + private ResourceService resService; + + public void test() { + resService.doing(); + } + } + + public static class ResourceService implements Service { + + private static final AtomicInteger counter = new AtomicInteger(); + + @Resource(name = "res.id") + private int id; + + @Resource(name = "res.name") + private String name; + + @ResourceInjected + private void onInjected(Object src, String fieldName) { + counter.incrementAndGet(); + System.out.println("资源被注入到对象(" + src + ")的字段(" + fieldName + ")上"); + } + + public void doing() { + System.out.println("id = " + id + ", name = " + name); + } + } +} diff --git a/src/test/java/org/redkale/test/util/ResourceListenerTest.java b/src/test/java/org/redkale/test/inject/ResourceListenerTest.java similarity index 93% rename from src/test/java/org/redkale/test/util/ResourceListenerTest.java rename to src/test/java/org/redkale/test/inject/ResourceListenerTest.java index 427999a41..f99e673aa 100644 --- a/src/test/java/org/redkale/test/util/ResourceListenerTest.java +++ b/src/test/java/org/redkale/test/inject/ResourceListenerTest.java @@ -1,15 +1,15 @@ /* */ -package org.redkale.test.util; +package org.redkale.test.inject; import java.util.Properties; import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.*; import org.redkale.annotation.Resource; -import org.redkale.annotation.ResourceListener; import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceFactory; import org.redkale.util.*; +import org.redkale.annotation.ResourceChanged; /** * @@ -71,7 +71,7 @@ public class ResourceListenerTest { @Resource(name = "property.desc", required = false) private String desc; - @ResourceListener + @ResourceChanged private void changeResource(ResourceEvent[] events) { for (ResourceEvent event : events) { counter.incrementAndGet(); @@ -92,7 +92,7 @@ public class ResourceListenerTest { @Resource private Environment env; - @ResourceListener + @ResourceChanged private void changeResource(ResourceEvent[] events) { for (ResourceEvent event : events) { counter.incrementAndGet(); @@ -116,7 +116,7 @@ public class ResourceListenerTest { @Resource private Environment env; - @ResourceListener + @ResourceChanged private void changeResource(ResourceEvent[] events) { for (ResourceEvent event : events) { counter.incrementAndGet(); diff --git a/src/test/java/org/redkale/test/util/ResourceLoaderTest.java b/src/test/java/org/redkale/test/inject/ResourceLoaderTest.java similarity index 94% rename from src/test/java/org/redkale/test/util/ResourceLoaderTest.java rename to src/test/java/org/redkale/test/inject/ResourceLoaderTest.java index 9d58df26b..da4981732 100644 --- a/src/test/java/org/redkale/test/util/ResourceLoaderTest.java +++ b/src/test/java/org/redkale/test/inject/ResourceLoaderTest.java @@ -1,6 +1,6 @@ /* */ -package org.redkale.test.util; +package org.redkale.test.inject; import org.junit.jupiter.api.*; import org.redkale.annotation.Resource; diff --git a/src/test/java/org/redkale/test/util/ResourceTest.java b/src/test/java/org/redkale/test/inject/ResourceTest.java similarity index 99% rename from src/test/java/org/redkale/test/util/ResourceTest.java rename to src/test/java/org/redkale/test/inject/ResourceTest.java index 5b5a9b567..2fb52739f 100644 --- a/src/test/java/org/redkale/test/util/ResourceTest.java +++ b/src/test/java/org/redkale/test/inject/ResourceTest.java @@ -3,7 +3,7 @@ * To change this template bigint, choose Tools | Templates * and open the template in the editor. */ -package org.redkale.test.util; +package org.redkale.test.inject; import java.math.BigInteger; import java.util.Properties; @@ -77,7 +77,7 @@ class BService { private String name = ""; - @ResourceListener + @ResourceChanged private void changeResource(ResourceEvent[] events) { for (ResourceEvent event : events) { System.out.println(getClass().getSimpleName() + " @Resource = " + event.name() + " 资源变更: newVal = " + event.newValue() + ", oldVal = " + event.oldValue());