diff --git a/src/main/java/org/redkale/annotation/Cached.java b/src/main/java/org/redkale/annotation/Cached.java
new file mode 100644
index 000000000..020d42eeb
--- /dev/null
+++ b/src/main/java/org/redkale/annotation/Cached.java
@@ -0,0 +1,75 @@
+/*
+ *
+ */
+package org.redkale.annotation;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @TODO 待实现
+ *
+ * 标记在Service的缓存接口, 方法有以下限制:
+ * 1、方法返回类型不能是void
+ * 2、方法必须是protected/public
+ * 3、方法不能是final
+ *
+ * @since 2.8.0
+ */
+@Inherited
+@Documented
+@Target(METHOD)
+@Retention(RUNTIME)
+public @interface Cached {
+
+ /**
+ * 缓存的key,支持参数动态组合,比如"key_#{id}"
+ *
+ * @return 键
+ */
+ String key();
+
+ /**
+ * 缓存的hash, 默认值用当前Service类的SimpleName
+ *
+ * @return hash
+ */
+ String map() default "";
+
+ /**
+ * 本地缓存过期时长, 0表示永不过期, -1表示不作本地缓存。
+ * 参数值支持方式:
+ * 100: 设置数值
+ * 5*60: 乘法表达式,值为30
+ * ${env.cache.expires}: 读取系统配置项
+ * #delays: 读取宿主对象的delays字段值作为值,字段类型必须是int、long数值类型
+ *
+ * @return 过期时长
+ */
+ String localExpire() default "-1";
+
+ /**
+ * 远程缓存过期时长, 0表示永不过期, -1表示不作远程缓存。
+ * 参数值支持方式:
+ * 100: 设置数值
+ * 5*60: 乘法表达式,值为30
+ * ${env.cache.expires}: 读取系统配置项
+ * #delays: 读取宿主对象的delays字段值作为值,字段类型必须是int、long数值类型
+ *
+ * @return 过期时长
+ */
+ String remoteExpire() default "-1";
+
+ /**
+ * 过期时长的时间单位
+ *
+ * @return 时间单位
+ */
+ TimeUnit timeUnit() default TimeUnit.SECONDS;
+
+}
diff --git a/src/main/java/org/redkale/annotation/Scheduled.java b/src/main/java/org/redkale/annotation/Scheduled.java
index 218acee19..60bd06acb 100644
--- a/src/main/java/org/redkale/annotation/Scheduled.java
+++ b/src/main/java/org/redkale/annotation/Scheduled.java
@@ -45,9 +45,11 @@ public @interface Scheduled {
/**
* 延迟时间,支持参数配置、乘法表达式和对象字段值
- * ${env.fixedDelay}: 读取系统配置项
+ * 参数值支持方式:
+ * 100: 设置数值
* 5*60: 乘法表达式,值为30
- * #delays: 读取对象的delays字段值作为值,字段类型必须是long
+ * ${env.scheduling.fixedDelay}: 读取系统配置项
+ * #delays: 读取宿主对象的delays字段值作为值,字段类型必须是int、long数值类型
*
* @return 延迟时间
*/
@@ -55,9 +57,11 @@ public @interface Scheduled {
/**
* 周期时间,支持参数配置、乘法表达式和对象字段值
- * ${env.fixedRate}: 读取系统配置项
+ * 参数值支持方式:
+ * 100: 设置数值
* 5*60: 乘法表达式,值为30
- * #intervals: 读取对象的intervals字段值作为值,字段类型必须是long
+ * ${env.scheduling.fixedRate}: 读取系统配置项
+ * #intervals: 读取宿主对象的intervals字段值作为值,字段类型必须是int、long数值类型
*
* @return 周期时间
*/
@@ -65,9 +69,11 @@ public @interface Scheduled {
/**
* 起始延迟时间,支持参数配置、乘法表达式和对象字段值
- * ${env.initialDelay}: 读取系统配置项
+ * 参数值支持方式:
+ * 100: 设置数值
* 5*60: 乘法表达式,值为30
- * #inits: 读取对象的inits字段值作为值,字段类型必须是long
+ * ${env.scheduling.initialDelay}: 读取系统配置项
+ * #inits: 读取宿主对象的inits字段值作为值,字段类型必须是int、long数值类型
*
* @return 起始延迟时间
*/
diff --git a/src/main/java/org/redkale/cacheing/CachedFactory.java b/src/main/java/org/redkale/cacheing/CachedFactory.java
new file mode 100644
index 000000000..260c9bd78
--- /dev/null
+++ b/src/main/java/org/redkale/cacheing/CachedFactory.java
@@ -0,0 +1,13 @@
+/*
+ *
+ */
+package org.redkale.cacheing;
+
+/**
+ * @TODO 待实现
+ *
+ * @author zhangjx
+ */
+public class CachedFactory {
+
+}
diff --git a/src/main/java/org/redkale/util/TypeToken.java b/src/main/java/org/redkale/util/TypeToken.java
index 444e47fd3..1046ba744 100644
--- a/src/main/java/org/redkale/util/TypeToken.java
+++ b/src/main/java/org/redkale/util/TypeToken.java
@@ -31,6 +31,11 @@ public abstract class TypeToken {
type = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
+ /**
+ * 具体泛型类型
+ *
+ * @return 泛型
+ */
public final Type getType() {
return type;
}
@@ -74,6 +79,13 @@ public abstract class TypeToken {
return true;
}
+ /**
+ * 判断泛型知否包含了不确定的数据类型
+ *
+ * @param type 类型
+ *
+ * @return 是否含不确定类型
+ */
public static final boolean containsUnknownType(final Type type) {
if (type == null) {
return false;
@@ -111,6 +123,13 @@ public abstract class TypeToken {
return true;
}
+ /**
+ * 获取type的主类
+ *
+ * @param type 类型
+ *
+ * @return 主类
+ */
public static final Class typeToClass(final Type type) {
if (type instanceof Class) {
return (Class) type;
@@ -133,11 +152,27 @@ public abstract class TypeToken {
return typeToClass(raw != null ? raw : owner);
}
+ /**
+ * 获取type的主类,如果是不确定类型,则返回defClass
+ *
+ * @param type 类型
+ * @param defClass 默认类
+ *
+ * @return 确定的类型
+ */
public static final Class typeToClassOrElse(final Type type, final Class defClass) {
Class clazz = typeToClass(type);
return clazz == null ? defClass : clazz;
}
+ /**
+ * 将泛型中不确定的类型转成确定性类型
+ *
+ * @param types 泛型集合
+ * @param declaringClass 宿主类型
+ *
+ * @return 确定性类型集合
+ */
public static Type[] getGenericType(final Type[] types, final Type declaringClass) {
Type[] newTypes = new Type[types.length];
for (int i = 0; i < newTypes.length; i++) {
@@ -146,6 +181,13 @@ public abstract class TypeToken {
return newTypes;
}
+ /**
+ * 获取primitive类对应的box类型
+ *
+ * @param clazz primitive类
+ *
+ * @return 基础类型box类型
+ */
public static Class primitiveToWrapper(Class clazz) {
if (clazz == boolean.class) {
return Boolean.class;
@@ -630,7 +672,7 @@ public abstract class TypeToken {
nsb.append(ch);
} else if (ch >= 'A' && ch <= 'Z') {
nsb.append(ch);
- } else {
+ } else { //特殊字符统一使用_
nsb.append('_');
}
}