enhancement #ICUEG9 JDK支持度更加平滑

This commit is contained in:
everywhere.z
2025-08-24 00:33:09 +08:00
parent 814c1409e2
commit 60739dd544
16 changed files with 36 additions and 126 deletions

View File

@@ -1,15 +0,0 @@
package com.yomahub.liteflow.annotation;
import java.lang.annotation.*;
/**
* @author Bryan.Zhang
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface LFAliasFor {
String value() default "";
}

View File

@@ -1,5 +1,7 @@
package com.yomahub.liteflow.annotation; package com.yomahub.liteflow.annotation;
import cn.hutool.core.annotation.MirrorFor;
import java.lang.annotation.*; import java.lang.annotation.*;
/** /**
@@ -20,10 +22,10 @@ import java.lang.annotation.*;
*/ */
public @interface LiteflowRetry { public @interface LiteflowRetry {
@LFAliasFor("retry") @MirrorFor(attribute = "retry")
int value() default 0; int value() default 0;
@LFAliasFor("value") @MirrorFor(attribute = "value")
int retry() default 0; int retry() default 0;
Class<? extends Exception>[] forExceptions() default { Exception.class }; Class<? extends Exception>[] forExceptions() default { Exception.class };

View File

@@ -1,69 +0,0 @@
package com.yomahub.liteflow.annotation.util;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.annotation.LFAliasFor;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 注解工具类
* 此工具类带缓存
*
* @author Bryan.Zhang
*/
public class AnnoUtil {
private static Map<String, Annotation> annoCacheMap = new ConcurrentHashMap<>();
public static <A extends Annotation> A getAnnotation(AnnotatedElement annotatedElement, Class<A> annotationType) {
String cacheKey = StrUtil.format("{}-{}", annotatedElement, annotationType.getSimpleName());
if (annoCacheMap.containsKey(cacheKey)){
return (A)annoCacheMap.get(cacheKey);
}
A annotation = AnnotationUtil.getAnnotation(annotatedElement, annotationType);
if (ObjectUtil.isNull(annotation)) {
return null;
}
Map<String, String> aliasMap = new HashMap<>();
Map<String, Object> defaultValueMap = new HashMap<>();
Arrays.stream(ReflectUtil.getMethods(annotationType)).forEach(method -> {
LFAliasFor aliasFor = AnnotationUtil.getAnnotation(method, LFAliasFor.class);
if (ObjectUtil.isNotNull(aliasFor)) {
aliasMap.put(method.getName(), aliasFor.value());
defaultValueMap.put(method.getName(), getDefaultValue(annotationType, method.getName()));
}
});
aliasMap.forEach((key, value1) -> {
Object value = ReflectUtil.invoke(annotation, key);
Object defaultValue = defaultValueMap.get(key);
if (ObjectUtil.notEqual(value, defaultValue)) {
AnnotationUtil.setValue(annotation, value1, value);
}
});
annoCacheMap.put(cacheKey, annotation);
return annotation;
}
private static <A extends Annotation> Object getDefaultValue(Class<A> annotationType, String property) {
try {
return annotationType.getMethod(property).getDefaultValue();
}
catch (Exception e) {
return null;
}
}
}

View File

@@ -1,6 +1,6 @@
package com.yomahub.liteflow.context; package com.yomahub.liteflow.context;
import com.yomahub.liteflow.annotation.LFAliasFor; import cn.hutool.core.annotation.MirrorFor;
import java.lang.annotation.*; import java.lang.annotation.*;
@@ -15,10 +15,10 @@ import java.lang.annotation.*;
@Documented @Documented
public @interface ContextBean { public @interface ContextBean {
@LFAliasFor("name") @MirrorFor(attribute = "name")
String value() default ""; String value() default "";
@LFAliasFor("value") @MirrorFor(attribute = "value")
String name() default ""; String name() default "";
} }

View File

@@ -1,9 +1,9 @@
package com.yomahub.liteflow.core; package com.yomahub.liteflow.core;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.annotation.LiteflowRetry; import com.yomahub.liteflow.annotation.LiteflowRetry;
import com.yomahub.liteflow.annotation.util.AnnoUtil;
import com.yomahub.liteflow.common.ChainConstant; import com.yomahub.liteflow.common.ChainConstant;
import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.enums.NodeTypeEnum;
import com.yomahub.liteflow.flow.executor.NodeExecutor; import com.yomahub.liteflow.flow.executor.NodeExecutor;
@@ -53,7 +53,7 @@ public class ComponentInitializer {
// 先从组件上取@RetryCount标注如果没有则看全局配置全局配置如果不配置的话默认是0 // 先从组件上取@RetryCount标注如果没有则看全局配置全局配置如果不配置的话默认是0
// 默认retryForExceptions为Exception.class // 默认retryForExceptions为Exception.class
LiteflowRetry liteFlowRetryAnnotation = AnnoUtil.getAnnotation(nodeComponent.getClass(), LiteflowRetry.class); LiteflowRetry liteFlowRetryAnnotation = AnnotationUtil.getAnnotationAlias(nodeComponent.getClass(), LiteflowRetry.class);
LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();
if (liteFlowRetryAnnotation != null) { if (liteFlowRetryAnnotation != null) {
nodeComponent.setRetryCount(liteFlowRetryAnnotation.retry()); nodeComponent.setRetryCount(liteFlowRetryAnnotation.retry());

View File

@@ -8,12 +8,12 @@
*/ */
package com.yomahub.liteflow.flow; package com.yomahub.liteflow.flow;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.annotation.FallbackCmp; import com.yomahub.liteflow.annotation.FallbackCmp;
import com.yomahub.liteflow.annotation.util.AnnoUtil;
import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder;
import com.yomahub.liteflow.core.ComponentInitializer; import com.yomahub.liteflow.core.ComponentInitializer;
import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.core.NodeComponent;
@@ -397,7 +397,7 @@ public class FlowBus {
// 判断是否是降级组件,如果是则添加到 fallbackNodeMap // 判断是否是降级组件,如果是则添加到 fallbackNodeMap
private static void addFallbackNode(Node node) { private static void addFallbackNode(Node node) {
NodeComponent nodeComponent = node.getInstance(); NodeComponent nodeComponent = node.getInstance();
FallbackCmp fallbackCmp = AnnoUtil.getAnnotation(nodeComponent.getClass(), FallbackCmp.class); FallbackCmp fallbackCmp = AnnotationUtil.getAnnotation(nodeComponent.getClass(), FallbackCmp.class);
if (fallbackCmp == null) { if (fallbackCmp == null) {
return; return;
} }

View File

@@ -1,6 +1,6 @@
package com.yomahub.liteflow.script.annotation; package com.yomahub.liteflow.script.annotation;
import com.yomahub.liteflow.annotation.LFAliasFor; import cn.hutool.core.annotation.MirrorFor;
import java.lang.annotation.*; import java.lang.annotation.*;
@@ -16,10 +16,10 @@ import java.lang.annotation.*;
@Inherited @Inherited
public @interface ScriptBean { public @interface ScriptBean {
@LFAliasFor("name") @MirrorFor(attribute = "name")
String value() default ""; String value() default "";
@LFAliasFor("value") @MirrorFor(attribute = "value")
String name() default ""; String name() default "";
String[] includeMethodName() default {}; String[] includeMethodName() default {};

View File

@@ -1,7 +1,5 @@
package com.yomahub.liteflow.script.annotation; package com.yomahub.liteflow.script.annotation;
import com.yomahub.liteflow.annotation.LFAliasFor;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited; import java.lang.annotation.Inherited;
@@ -20,7 +18,6 @@ import java.lang.annotation.Target;
@Inherited @Inherited
public @interface ScriptMethod { public @interface ScriptMethod {
@LFAliasFor("name")
String value() default ""; String value() default "";
} }

View File

@@ -7,13 +7,12 @@
*/ */
package com.yomahub.liteflow.slot; package com.yomahub.liteflow.slot;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.lang.Tuple; import cn.hutool.core.lang.Tuple;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.annotation.util.AnnoUtil;
import com.yomahub.liteflow.context.ContextBean; import com.yomahub.liteflow.context.ContextBean;
import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLog;
import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.log.LFLoggerManager;
@@ -84,7 +83,7 @@ public class DataBus {
public static int offerSlotByBean(List<Object> contextList) { public static int offerSlotByBean(List<Object> contextList) {
List<Tuple> contextBeanList = contextList.stream().filter(Objects::nonNull).map(object -> { List<Tuple> contextBeanList = contextList.stream().filter(Objects::nonNull).map(object -> {
ContextBean contextBean = AnnoUtil.getAnnotation(object.getClass(), ContextBean.class); ContextBean contextBean = AnnotationUtil.getAnnotationAlias(object.getClass(), ContextBean.class);
String contextKey; String contextKey;
if (contextBean != null && StrUtil.isNotBlank(contextBean.value())){ if (contextBean != null && StrUtil.isNotBlank(contextBean.value())){
contextKey = contextBean.value(); contextKey = contextBean.value();

View File

@@ -1,5 +1,7 @@
package com.yomahub.liteflow.annotation; package com.yomahub.liteflow.annotation;
import cn.hutool.core.annotation.MirrorFor;
import java.lang.annotation.*; import java.lang.annotation.*;
/** /**
@@ -14,10 +16,10 @@ import java.lang.annotation.*;
@Inherited @Inherited
public @interface LiteflowComponent { public @interface LiteflowComponent {
@LFAliasFor("id") @MirrorFor(attribute = "id")
String value() default ""; String value() default "";
@LFAliasFor("value") @MirrorFor(attribute = "value")
String id() default ""; String id() default "";
String name() default ""; String name() default "";

View File

@@ -3,17 +3,14 @@ package com.yomahub.liteflow.spi.solon;
import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.annotation.*; import com.yomahub.liteflow.annotation.*;
import com.yomahub.liteflow.annotation.util.AnnoUtil;
import com.yomahub.liteflow.core.proxy.DeclWarpBean; import com.yomahub.liteflow.core.proxy.DeclWarpBean;
import com.yomahub.liteflow.core.proxy.MethodWrapBean; import com.yomahub.liteflow.core.proxy.MethodWrapBean;
import com.yomahub.liteflow.core.proxy.ParameterWrapBean; import com.yomahub.liteflow.core.proxy.ParameterWrapBean;
import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.enums.NodeTypeEnum;
import com.yomahub.liteflow.exception.CmpDefinitionException; import com.yomahub.liteflow.exception.CmpDefinitionException;
import com.yomahub.liteflow.exception.NotSupportDeclException;
import com.yomahub.liteflow.spi.DeclComponentParser; import com.yomahub.liteflow.spi.DeclComponentParser;
import org.noear.solon.Solon; import org.noear.solon.Solon;
import org.noear.solon.annotation.Component; import org.noear.solon.annotation.Component;
import org.noear.solon.core.BeanWrap;
import java.lang.reflect.Parameter; import java.lang.reflect.Parameter;
import java.util.Arrays; import java.util.Arrays;
@@ -39,14 +36,14 @@ public class SolonDeclComponentParser implements DeclComponentParser {
method -> AnnotationUtil.getAnnotation(method, LiteflowMethod.class) != null method -> AnnotationUtil.getAnnotation(method, LiteflowMethod.class) != null
).map(method -> { ).map(method -> {
LiteflowMethod liteflowMethod = AnnotationUtil.getAnnotation(method, LiteflowMethod.class); LiteflowMethod liteflowMethod = AnnotationUtil.getAnnotation(method, LiteflowMethod.class);
LiteflowRetry liteflowRetry = AnnotationUtil.getAnnotation(method, LiteflowRetry.class); LiteflowRetry liteflowRetry = AnnotationUtil.getAnnotationAlias(method, LiteflowRetry.class);
String currNodeId = null; String currNodeId = null;
String currNodeName = null; String currNodeName = null;
if (nodeId == null){ if (nodeId == null){
if (StrUtil.isBlank(liteflowMethod.nodeId())){ if (StrUtil.isBlank(liteflowMethod.nodeId())){
LiteflowComponent liteflowComponent = AnnoUtil.getAnnotation(clazz, LiteflowComponent.class); LiteflowComponent liteflowComponent = AnnotationUtil.getAnnotationAlias(clazz, LiteflowComponent.class);
Component component = AnnoUtil.getAnnotation(clazz, Component.class); Component component = AnnotationUtil.getAnnotation(clazz, Component.class);
if(liteflowComponent != null){ if(liteflowComponent != null){
currNodeId = liteflowComponent.value(); currNodeId = liteflowComponent.value();

View File

@@ -1,5 +1,6 @@
package com.yomahub.liteflow.annotation; package com.yomahub.liteflow.annotation;
import cn.hutool.core.annotation.MirrorFor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.*; import java.lang.annotation.*;
@@ -18,12 +19,10 @@ import java.lang.annotation.*;
public @interface LiteflowComponent { public @interface LiteflowComponent {
@AliasFor(annotation = Component.class, attribute = "value") @AliasFor(annotation = Component.class, attribute = "value")
@LFAliasFor("id") String value() default "";
String value() default "";
@AliasFor(annotation = Component.class, attribute = "value") @AliasFor(annotation = Component.class, attribute = "value")
@LFAliasFor("value") String id() default "";
String id() default "";
String name() default ""; String name() default "";

View File

@@ -1,7 +1,7 @@
package com.yomahub.liteflow.process.impl; package com.yomahub.liteflow.process.impl;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.yomahub.liteflow.annotation.util.AnnoUtil;
import com.yomahub.liteflow.process.LiteflowScannerProcessStep; import com.yomahub.liteflow.process.LiteflowScannerProcessStep;
import com.yomahub.liteflow.process.context.LiteflowScannerProcessStepContext; import com.yomahub.liteflow.process.context.LiteflowScannerProcessStepContext;
import com.yomahub.liteflow.process.enums.LiteflowScannerProcessStepEnum; import com.yomahub.liteflow.process.enums.LiteflowScannerProcessStepEnum;
@@ -24,7 +24,7 @@ public class ScriptBeanProcess implements LiteflowScannerProcessStep {
public boolean filter(LiteflowScannerProcessStepContext ctx) { public boolean filter(LiteflowScannerProcessStepContext ctx) {
Class clazz = ctx.getClazz(); Class clazz = ctx.getClazz();
ScriptBean outPut = AnnoUtil.getAnnotation(clazz, ScriptBean.class); ScriptBean outPut = AnnotationUtil.getAnnotationAlias(clazz, ScriptBean.class);
ctx.setOutPut(outPut); ctx.setOutPut(outPut);
return ObjectUtil.isNotNull(outPut); return ObjectUtil.isNotNull(outPut);

View File

@@ -1,10 +1,10 @@
package com.yomahub.liteflow.process.impl; package com.yomahub.liteflow.process.impl;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.annotation.util.AnnoUtil;
import com.yomahub.liteflow.process.LiteflowScannerProcessStep; import com.yomahub.liteflow.process.LiteflowScannerProcessStep;
import com.yomahub.liteflow.process.context.LiteflowScannerProcessStepContext; import com.yomahub.liteflow.process.context.LiteflowScannerProcessStepContext;
import com.yomahub.liteflow.process.enums.LiteflowScannerProcessStepEnum; import com.yomahub.liteflow.process.enums.LiteflowScannerProcessStepEnum;
@@ -34,7 +34,7 @@ public class ScriptMethodBeanProcess implements LiteflowScannerProcessStep {
Class clazz = ctx.getClazz(); Class clazz = ctx.getClazz();
List<Method> outPut = Arrays.stream(clazz.getMethods()).filter(method -> { List<Method> outPut = Arrays.stream(clazz.getMethods()).filter(method -> {
ScriptMethod scriptMethod = AnnoUtil.getAnnotation(method, ScriptMethod.class); ScriptMethod scriptMethod = AnnotationUtil.getAnnotation(method, ScriptMethod.class);
return ObjectUtil.isNotNull(scriptMethod) && StrUtil.isNotEmpty(scriptMethod.value()); return ObjectUtil.isNotNull(scriptMethod) && StrUtil.isNotEmpty(scriptMethod.value());
}).collect(Collectors.toList()); }).collect(Collectors.toList());
@@ -53,7 +53,7 @@ public class ScriptMethodBeanProcess implements LiteflowScannerProcessStep {
LOG.info("script method[{}] has been found", beanName); LOG.info("script method[{}] has been found", beanName);
Map<String, List<Method>> scriptMethodsGroupByValue = CollStreamUtil.groupBy(scriptMethods, method -> { Map<String, List<Method>> scriptMethodsGroupByValue = CollStreamUtil.groupBy(scriptMethods, method -> {
ScriptMethod scriptMethod = AnnoUtil.getAnnotation(method, ScriptMethod.class); ScriptMethod scriptMethod = AnnotationUtil.getAnnotation(method, ScriptMethod.class);
return scriptMethod.value(); return scriptMethod.value();
}, Collectors.toList()); }, Collectors.toList());

View File

@@ -1,10 +1,8 @@
package com.yomahub.liteflow.spi.spring; package com.yomahub.liteflow.spi.spring;
import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.annotation.*; import com.yomahub.liteflow.annotation.*;
import com.yomahub.liteflow.annotation.util.AnnoUtil;
import com.yomahub.liteflow.core.proxy.DeclWarpBean; import com.yomahub.liteflow.core.proxy.DeclWarpBean;
import com.yomahub.liteflow.core.proxy.MethodWrapBean; import com.yomahub.liteflow.core.proxy.MethodWrapBean;
import com.yomahub.liteflow.core.proxy.ParameterWrapBean; import com.yomahub.liteflow.core.proxy.ParameterWrapBean;
@@ -13,13 +11,13 @@ import com.yomahub.liteflow.exception.CmpDefinitionException;
import com.yomahub.liteflow.spi.DeclComponentParser; import com.yomahub.liteflow.spi.DeclComponentParser;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.lang.reflect.Parameter; import java.lang.reflect.Parameter;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.IntStream; import java.util.stream.IntStream;
@@ -40,14 +38,14 @@ public class SpringDeclComponentParser implements DeclComponentParser {
method -> AnnotationUtil.getAnnotation(method, LiteflowMethod.class) != null method -> AnnotationUtil.getAnnotation(method, LiteflowMethod.class) != null
).map(method -> { ).map(method -> {
LiteflowMethod liteflowMethod = AnnotationUtil.getAnnotation(method, LiteflowMethod.class); LiteflowMethod liteflowMethod = AnnotationUtil.getAnnotation(method, LiteflowMethod.class);
LiteflowRetry liteflowRetry = AnnotationUtil.getAnnotation(method, LiteflowRetry.class); LiteflowRetry liteflowRetry = AnnotationUtil.getAnnotationAlias(method, LiteflowRetry.class);
String currNodeId = null; String currNodeId = null;
String currNodeName = null; String currNodeName = null;
if (nodeId == null){ if (nodeId == null){
if (StrUtil.isBlank(liteflowMethod.nodeId())){ if (StrUtil.isBlank(liteflowMethod.nodeId())){
LiteflowComponent liteflowComponent = AnnoUtil.getAnnotation(clazz, LiteflowComponent.class); LiteflowComponent liteflowComponent = AnnotationUtils.getAnnotation(clazz, LiteflowComponent.class);
Component component = AnnoUtil.getAnnotation(clazz, Component.class); Component component = AnnotationUtil.getAnnotation(clazz, Component.class);
if(liteflowComponent != null){ if(liteflowComponent != null){
currNodeId = liteflowComponent.value(); currNodeId = liteflowComponent.value();

View File

@@ -52,7 +52,7 @@
<dom4j.version>2.1.4</dom4j.version> <dom4j.version>2.1.4</dom4j.version>
<curator.version>5.3.0</curator.version> <curator.version>5.3.0</curator.version>
<junit.version>5.8.2</junit.version> <junit.version>5.8.2</junit.version>
<hutool.version>5.8.26</hutool.version> <hutool.version>5.8.39</hutool.version>
<transmittable-thread-local.version>2.14.5</transmittable-thread-local.version> <transmittable-thread-local.version>2.14.5</transmittable-thread-local.version>
<curator-test.version>5.1.0</curator-test.version> <curator-test.version>5.1.0</curator-test.version>
<zkclient.version>0.10</zkclient.version> <zkclient.version>0.10</zkclient.version>