From 14238a0203d2cba52c570e4555f35197b6087dd6 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Tue, 30 May 2017 07:22:45 +0800 Subject: [PATCH] --- src/org/redkale/util/ResourceFactory.java | 289 +++++++++++++++++++--- 1 file changed, 257 insertions(+), 32 deletions(-) diff --git a/src/org/redkale/util/ResourceFactory.java b/src/org/redkale/util/ResourceFactory.java index b7e2db124..f5204e681 100644 --- a/src/org/redkale/util/ResourceFactory.java +++ b/src/org/redkale/util/ResourceFactory.java @@ -18,7 +18,7 @@ import javax.annotation.Resource; * 依赖注入功能主类
* * 如果@Resource(name = "$") 表示资源name采用所属对象的name
- * 如果没有@Resource 则会取对象的getResourceName()方法值(若存在) + * 如果没有@Resource且对象实现了Resourcable, 则会取对象的resourceName()方法值 *
  * name规则:
  *    1: "$"有特殊含义, 不能表示"$"资源本身
@@ -50,16 +50,31 @@ public final class ResourceFactory {
         this.parent = parent;
     }
 
+    /**
+     * 获取根ResourceFactory
+     *
+     * @return ResourceFactory
+     */
     public static ResourceFactory root() {
         return instance;
     }
 
+    /**
+     * 创建ResourceFactory子节点
+     *
+     * @return ResourceFactory
+     */
     public ResourceFactory createChild() {
         ResourceFactory child = new ResourceFactory(this);
         this.chidren.add(new WeakReference<>(child));
         return child;
     }
 
+    /**
+     * 获取所有ResourceFactory子节点
+     *
+     * @return List
+     */
     public List getChildren() {
         List result = new ArrayList<>();
         for (WeakReference ref : chidren) {
@@ -69,105 +84,267 @@ public final class ResourceFactory {
         return result;
     }
 
+    /**
+     * 清空当前ResourceFactory注入资源
+     *
+     */
     public void release() {
         this.store.clear();
     }
 
+    /**
+     * 检查资源名是否合法
+     * 
+     * name规则:
+     *    1: "$"有特殊含义, 不能表示"$"资源本身
+     *    2: 只能是字母、数字、(短横)-、(下划线)_、点(.)的组合
+     * 
+ *

+ * @param name + */ public void checkName(String name) { if (name == null || (!name.isEmpty() && !name.matches("^[a-zA-Z0-9_;\\-\\.\\[\\]\\(\\)]+$"))) { throw new IllegalArgumentException("Resource.name(" + name + ") contains illegal character, must be (a-z,A-Z,0-9,_,.,(,),-,[,])"); } } + /** + * 将对象指定类型且name=""注入到资源池中,并同步已被注入的资源 + * + * @param 泛型 + * @param clazz 资源类型 + * @param rs 资源对象 + * + * @return 旧资源对象 + */ public A register(final Class clazz, final A rs) { return register(true, clazz, rs); } + /** + * 将对象指定类型且name=""注入到资源池中 + * + * @param 泛型 + * @param autoSync 是否同步已被注入的资源 + * @param clazz 资源类型 + * @param rs 资源对象 + * + * @return 旧资源对象 + */ public A register(final boolean autoSync, final Class clazz, final A rs) { return register(autoSync, "", clazz, rs); } + /** + * 将对象以name=""注入到资源池中,并同步已被注入的资源 + * + * @param 泛型 + * @param rs 资源对象 + * + * @return 旧资源对象 + */ public A register(final A rs) { return register(true, rs); } + /** + * 将对象以name=""注入到资源池中,并同步已被注入的资源 + * + * @param 泛型 + * @param autoSync 是否同步已被注入的资源 + * @param rs 资源对象 + * + * @return 旧资源对象 + */ public A register(final boolean autoSync, final A rs) { if (rs == null) return null; return (A) register(autoSync, "", rs); } - public void register(final Type clazz, final ResourceLoader rs) { - if (clazz == null || rs == null) return; - loadermap.put(clazz, rs); - } - - public void register(final ResourceLoader rs, final Type... clazzs) { - if (clazzs == null || rs == null) return; - for (Type clazz : clazzs) { - loadermap.put(clazz, rs); - } - } - + /** + * 将boolean对象以指定资源名注入到资源池中,并同步已被注入的资源 + * + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final String name, final boolean value) { register(true, name, boolean.class, value); } + /** + * 将boolean对象以指定资源名注入到资源池中 + * + * @param autoSync 是否同步已被注入的资源 + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final boolean autoSync, final String name, final boolean value) { register(autoSync, name, boolean.class, value); } + /** + * 将byte对象以指定资源名注入到资源池中,并同步已被注入的资源 + * + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final String name, final byte value) { register(true, name, byte.class, value); } + /** + * 将byte对象以指定资源名注入到资源池中 + * + * @param autoSync 是否同步已被注入的资源 + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final boolean autoSync, final String name, final byte value) { register(autoSync, name, byte.class, value); } + /** + * 将short对象以指定资源名注入到资源池中,并同步已被注入的资源 + * + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final String name, final short value) { register(true, name, short.class, value); } + /** + * 将short对象以指定资源名注入到资源池中 + * + * @param autoSync 是否同步已被注入的资源 + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final boolean autoSync, final String name, final short value) { register(autoSync, name, short.class, value); } + /** + * 将int对象以指定资源名注入到资源池中,并同步已被注入的资源 + * + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final String name, final int value) { register(true, name, int.class, value); } + /** + * 将int对象以指定资源名注入到资源池中 + * + * @param autoSync 是否同步已被注入的资源 + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final boolean autoSync, final String name, final int value) { register(autoSync, name, int.class, value); } + /** + * 将float对象以指定资源名注入到资源池中,并同步已被注入的资源 + * + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final String name, final float value) { register(true, name, float.class, value); } + /** + * 将float对象以指定资源名注入到资源池中 + * + * @param autoSync 是否同步已被注入的资源 + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final boolean autoSync, final String name, final float value) { register(autoSync, name, float.class, value); } + /** + * 将long对象以指定资源名注入到资源池中,并同步已被注入的资源 + * + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final String name, final long value) { register(true, name, long.class, value); } + /** + * 将long对象以指定资源名注入到资源池中 + * + * @param autoSync 是否同步已被注入的资源 + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final boolean autoSync, final String name, final long value) { register(autoSync, name, long.class, value); } + /** + * 将double对象以指定资源名注入到资源池中,并同步已被注入的资源 + * + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final String name, final double value) { register(true, name, double.class, value); } + /** + * 将double对象以指定资源名注入到资源池中 + * + * @param autoSync 是否同步已被注入的资源 + * @param name 资源名 + * @param value 资源值 + * + */ public void register(final boolean autoSync, final String name, final double value) { register(autoSync, name, double.class, value); } + /** + * 将对象以指定资源名注入到资源池中,并同步已被注入的资源 + * + * @param 泛型 + * @param name 资源名 + * @param rs 资源对象 + * + * @return 旧资源对象 + */ public A register(final String name, final A rs) { return register(true, name, rs); } + /** + * 将对象以指定资源名注入到资源池中 + * + * @param 泛型 + * @param autoSync 是否同步已被注入的资源 + * @param name 资源名 + * @param rs 资源对象 + * + * @return 旧资源对象 + */ public A register(final boolean autoSync, final String name, final A rs) { checkName(name); final Class claz = rs.getClass(); @@ -182,14 +359,45 @@ public final class ResourceFactory { } } + /** + * 将对象以指定资源名和类型注入到资源池中,并同步已被注入的资源 + * + * @param 泛型 + * @param name 资源名 + * @param clazz 资源类型 + * @param rs 资源对象 + * + * @return 旧资源对象 + */ public A register(final String name, final Class clazz, final A rs) { return register(true, name, clazz, rs); } + /** + * 将对象以指定资源名和类型注入到资源池中,并同步已被注入的资源 + * + * @param 泛型 + * @param name 资源名 + * @param clazz 资源类型 + * @param rs 资源对象 + * + * @return 旧资源对象 + */ public A register(final String name, final Type clazz, final A rs) { return register(true, name, clazz, rs); } + /** + * 将对象以指定资源名和类型注入到资源池中 + * + * @param 泛型 + * @param autoSync 是否同步已被注入的资源 + * @param name 资源名 + * @param clazz 资源类型 + * @param rs 资源对象 + * + * @return 旧资源对象 + */ public A register(final boolean autoSync, final String name, final Type clazz, final A rs) { checkName(name); ConcurrentHashMap map = this.store.get(clazz); @@ -211,9 +419,19 @@ public final class ResourceFactory { return re == null ? null : (A) re.value; } - public boolean contains(String name, Class clazz) { + /** + * 判断是否包含指定资源名和资源类型的资源对象 + * + * @param 泛型 + * @param recursive 是否遍历父节点 + * @param name 资源名 + * @param clazz 资源类型 + * + * @return 是否存在 + */ + public boolean contains(boolean recursive, String name, Class clazz) { Map map = this.store.get(clazz); - return map == null ? false : map.containsKey(name); + return map == null ? ((recursive && parent != null) ? parent.contains(recursive, name, clazz) : false) : map.containsKey(name); } public A find(Class clazz) { @@ -225,6 +443,23 @@ public final class ResourceFactory { return re == null ? null : (A) re.value; } + public A find(String name, Class clazz) { + ResourceEntry re = findEntry(name, clazz); + return re == null ? null : re.value; + } + + public A findChild(final String name, final Class clazz) { + A rs = find(name, clazz); + if (rs != null) return rs; + for (Map.Entry> en : this.store.entrySet()) { + if (!(en.getKey() instanceof Class)) continue; + if (!clazz.isAssignableFrom((Class) en.getKey())) continue; + ResourceEntry v = en.getValue().get(name); + if (v != null) return (A) v.value; + } + return null; + } + private ResourceEntry findEntry(String name, Type clazz) { Map map = this.store.get(clazz); if (map != null) { @@ -254,11 +489,6 @@ public final class ResourceFactory { return list; } - public A find(String name, Class clazz) { - ResourceEntry re = findEntry(name, clazz); - return re == null ? null : re.value; - } - private ResourceEntry findEntry(String name, Class clazz) { Map map = this.store.get(clazz); if (map != null) { @@ -269,18 +499,6 @@ public final class ResourceFactory { return null; } - public A findChild(final String name, final Class clazz) { - A rs = find(name, clazz); - if (rs != null) return rs; - for (Map.Entry> en : this.store.entrySet()) { //不用forEach为兼容JDK 6 - if (!(en.getKey() instanceof Class)) continue; - if (!clazz.isAssignableFrom((Class) en.getKey())) continue; - ResourceEntry v = en.getValue().get(name); - if (v != null) return (A) v.value; - } - return null; - } - public boolean inject(final Object src) { return inject(src, null); } @@ -410,6 +628,13 @@ public final class ResourceFactory { } } + public void register(final ResourceLoader rs, final Type... clazzs) { + if (clazzs == null || rs == null) return; + for (Type clazz : clazzs) { + loadermap.put(clazz, rs); + } + } + private ResourceLoader findMatchLoader(Type ft, Field field) { ResourceLoader it = this.loadermap.get(ft); if (it == null && field != null) it = this.loadermap.get(field.getType());