From c9c9b05f186c2d952b72bd8f68a5520b151b80ad Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Thu, 17 Jul 2025 19:08:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B8=E5=BF=83=E6=9C=8D=E5=8A=A1=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E6=9C=BA=E5=88=B6=E5=AE=8C=E6=88=90=EF=BC=8CPartner?= =?UTF-8?q?=E5=BE=85=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将`methodSignature`抽取至工具类中 - 新增了数个异常类,适配工厂注册时的异常处理 - 完善了核心服务的注解检测、函数路由表生成以及代理动态注入实现。 --- .xcodemap/config/xcodemap-class-filter.yaml | 20 ++ .../src/main/java/work/slhaf/Main.java | 12 + .../work/slhaf/demo/MyCognationManager.java | 7 +- .../main/java/work/slhaf/demo/TestModule.java | 16 ++ .../ability/CacheCapability.java | 6 +- .../ability/MemoryCapability.java | 6 +- .../ability/PerceiveCapability.java | 4 +- .../capability/CapabilityRegisterFactory.java | 217 +++++++++++++++--- .../Capability.java | 2 +- .../CapabilityCore.java | 2 +- .../CapabilityMethod.java | 2 +- .../Coordinated.java | 2 +- .../InjectCapability.java | 2 +- .../ToCoordinated.java | 2 +- .../CapabilityCheckFailedException.java | 6 +- .../CoreInstancesCreateFailedException.java | 11 + .../DuplicateCapabilityException.java | 4 + .../exception/DuplicateMethodException.java | 11 + .../EmptyCapabilityHolderException.java | 11 + .../FactoryExecuteFailedException.java | 11 + .../exception/ProxySetFailedException.java | 11 + .../UnMatchedCapabilityException.java | 4 + .../UnMatchedCapabilityMethodException.java | 4 + .../UnMatchedCoordinatedMethodException.java | 4 + .../capability/module/CapabilityHolder.java | 9 + .../demo/capability/util/CapabilityUtil.java | 19 ++ .../java/work/slhaf/demo/core/CacheCore.java | 19 +- .../java/work/slhaf/demo/core/MemoryCore.java | 15 +- .../work/slhaf/demo/core/PerceiveCore.java | 15 +- .../src/test/java/FunctionRouterTest.java | 15 ++ 30 files changed, 383 insertions(+), 86 deletions(-) create mode 100644 .xcodemap/config/xcodemap-class-filter.yaml create mode 100644 Partner-Capability-Demo/src/main/java/work/slhaf/Main.java create mode 100644 Partner-Capability-Demo/src/main/java/work/slhaf/demo/TestModule.java rename Partner-Capability-Demo/src/main/java/work/slhaf/demo/{capability => }/ability/CacheCapability.java (73%) rename Partner-Capability-Demo/src/main/java/work/slhaf/demo/{capability => }/ability/MemoryCapability.java (62%) rename Partner-Capability-Demo/src/main/java/work/slhaf/demo/{capability => }/ability/PerceiveCapability.java (67%) rename Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/{interfaces => annotation}/Capability.java (88%) rename Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/{interfaces => annotation}/CapabilityCore.java (88%) rename Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/{interfaces => annotation}/CapabilityMethod.java (84%) rename Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/{interfaces => annotation}/Coordinated.java (88%) rename Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/{interfaces => annotation}/InjectCapability.java (86%) rename Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/{interfaces => annotation}/ToCoordinated.java (91%) create mode 100644 Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/CoreInstancesCreateFailedException.java create mode 100644 Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/DuplicateMethodException.java create mode 100644 Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/EmptyCapabilityHolderException.java create mode 100644 Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/FactoryExecuteFailedException.java create mode 100644 Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/ProxySetFailedException.java create mode 100644 Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/module/CapabilityHolder.java create mode 100644 Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/util/CapabilityUtil.java create mode 100644 Partner-Capability-Demo/src/test/java/FunctionRouterTest.java diff --git a/.xcodemap/config/xcodemap-class-filter.yaml b/.xcodemap/config/xcodemap-class-filter.yaml new file mode 100644 index 00000000..e11e503c --- /dev/null +++ b/.xcodemap/config/xcodemap-class-filter.yaml @@ -0,0 +1,20 @@ +autoDetectedPackages: +- work.slhaf +enableAutoDetect: true +entryDisplayConfig: null +funcDisplayConfig: null +ignoreSameClassCall: null +ignoreSamePackageCall: null +includedPackagePrefixes: null +includedParentClasses: null +maxColSize: null +maxNumFirst: null +maxNumFirstImportant: null +maxNumHash: null +maxNumHashImportant: null +maxObjectDepth: null +maxStrSize: null +name: xcodemap-filter +recordMode: null +sourceDisplayConfig: null +startOnDebug: null diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/Main.java b/Partner-Capability-Demo/src/main/java/work/slhaf/Main.java new file mode 100644 index 00000000..293e4faf --- /dev/null +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/Main.java @@ -0,0 +1,12 @@ +package work.slhaf; + +import work.slhaf.demo.TestModule; +import work.slhaf.demo.capability.CapabilityRegisterFactory; + +public class Main { + public static void main(String[] args) throws ClassNotFoundException { + TestModule testModule = new TestModule(); + CapabilityRegisterFactory.getInstance().registerCapabilities(Main.class.getPackage().getName()); + testModule.execute(); + } +} \ No newline at end of file diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/MyCognationManager.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/MyCognationManager.java index ea352559..28ac9d6e 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/MyCognationManager.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/MyCognationManager.java @@ -1,15 +1,14 @@ package work.slhaf.demo; import work.slhaf.demo.capability.BaseCognationManager; -import work.slhaf.demo.capability.interfaces.Coordinated; +import work.slhaf.demo.capability.annotation.Coordinated; -import java.util.ArrayList; import java.util.List; public class MyCognationManager extends BaseCognationManager { @Coordinated(capability = "memory") - public List selectMemory(String path){ - return null; + public List selectMemory(String path) { + return List.of("1", "2", path); } } diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/TestModule.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/TestModule.java new file mode 100644 index 00000000..cd872149 --- /dev/null +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/TestModule.java @@ -0,0 +1,16 @@ +package work.slhaf.demo; + +import work.slhaf.demo.ability.CacheCapability; +import work.slhaf.demo.ability.MemoryCapability; +import work.slhaf.demo.capability.annotation.InjectCapability; +import work.slhaf.demo.capability.module.CapabilityHolder; + +public class TestModule extends CapabilityHolder { + @InjectCapability + private MemoryCapability capability; + + public void execute(){ + System.out.println("111"); + System.out.println(capability.selectMemory("zjw")); + } +} diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/ability/CacheCapability.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/ability/CacheCapability.java similarity index 73% rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/ability/CacheCapability.java rename to Partner-Capability-Demo/src/main/java/work/slhaf/demo/ability/CacheCapability.java index 8081da5e..60156b72 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/ability/CacheCapability.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/ability/CacheCapability.java @@ -1,7 +1,7 @@ -package work.slhaf.demo.capability.ability; +package work.slhaf.demo.ability; -import work.slhaf.demo.capability.interfaces.Capability; +import work.slhaf.demo.capability.annotation.Capability; import java.time.LocalDateTime; import java.util.HashMap; @@ -13,5 +13,5 @@ public interface CacheCapability { ConcurrentHashMap getUserDialogMap(String userId); void updateDialogMap(LocalDateTime dateTime, String newDialogCache); String getDialogMapStr(); - String getUserDialogMapStr(String userId); + String getUserDialogMapStr(String userId,int id); } diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/ability/MemoryCapability.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/ability/MemoryCapability.java similarity index 62% rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/ability/MemoryCapability.java rename to Partner-Capability-Demo/src/main/java/work/slhaf/demo/ability/MemoryCapability.java index 784184a1..de940908 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/ability/MemoryCapability.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/ability/MemoryCapability.java @@ -1,7 +1,7 @@ -package work.slhaf.demo.capability.ability; +package work.slhaf.demo.ability; -import work.slhaf.demo.capability.interfaces.Capability; -import work.slhaf.demo.capability.interfaces.ToCoordinated; +import work.slhaf.demo.capability.annotation.Capability; +import work.slhaf.demo.capability.annotation.ToCoordinated; import java.util.List; diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/ability/PerceiveCapability.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/ability/PerceiveCapability.java similarity index 67% rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/ability/PerceiveCapability.java rename to Partner-Capability-Demo/src/main/java/work/slhaf/demo/ability/PerceiveCapability.java index f4d6df4a..33dba3d7 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/ability/PerceiveCapability.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/ability/PerceiveCapability.java @@ -1,6 +1,6 @@ -package work.slhaf.demo.capability.ability; +package work.slhaf.demo.ability; -import work.slhaf.demo.capability.interfaces.Capability; +import work.slhaf.demo.capability.annotation.Capability; @Capability(value = "perceive") public interface PerceiveCapability { diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/CapabilityRegisterFactory.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/CapabilityRegisterFactory.java index aa35e36f..58672482 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/CapabilityRegisterFactory.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/CapabilityRegisterFactory.java @@ -1,24 +1,33 @@ package work.slhaf.demo.capability; -import lombok.Setter; import org.reflections.Reflections; import org.reflections.scanners.Scanners; import org.reflections.util.ClasspathHelper; import org.reflections.util.ConfigurationBuilder; import work.slhaf.demo.capability.exception.*; -import work.slhaf.demo.capability.interfaces.*; +import work.slhaf.demo.capability.annotation.*; +import work.slhaf.demo.capability.module.CapabilityHolder; +import work.slhaf.demo.capability.util.CapabilityUtil; -import java.lang.reflect.Method; +import java.lang.reflect.*; import java.net.URL; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; -public class CapabilityRegisterFactory { +import static work.slhaf.demo.capability.util.CapabilityUtil.methodSignature; + +public final class CapabilityRegisterFactory { public static volatile CapabilityRegisterFactory capabilityRegisterFactory; - @Setter private Reflections reflections; + private final HashMap> methodsRouterTable = new HashMap<>(); + private final HashMap> coordinatedMethodsRouterTable = new HashMap<>(); + private final HashMap, Object> capabilityCoreInstances = new HashMap<>(); + private final HashMap, Object> capabilityHolderInstances = new HashMap<>(); + private Set> cores; + private Set> capabilities; private CapabilityRegisterFactory() { } @@ -28,39 +37,180 @@ public class CapabilityRegisterFactory { synchronized (CapabilityRegisterFactory.class) { if (capabilityRegisterFactory == null) { capabilityRegisterFactory = new CapabilityRegisterFactory(); - capabilityRegisterFactory.setReflections(getReflections()); } } } return capabilityRegisterFactory; } - private static Reflections getReflections() { + + public void registerCapabilities(String scannerPath) { + setBasicVariable(scannerPath); + //检查可注册能力是否正常 + statusCheck(); + generateMethodsRouterTable(); + generateCoordinatedMethodsRouterTable(); + //扫描现有Capability, value为键,返回函数路由表, 函数路由表内部通过反射调用对应core的方法 + injectCapability(); + } + + private void generateCoordinatedMethodsRouterTable() { + Set methodsAnnotatedWith = reflections.getMethodsAnnotatedWith(Coordinated.class); + if (methodsAnnotatedWith.isEmpty()) { + return; + } + try { + //获取所有CM实例 + HashMap cognationManagerInstances = getCognationManagerInstances(); + methodsAnnotatedWith.forEach(method -> { + String key = method.getAnnotation(Coordinated.class).capability() + "." + methodSignature(method); + Function function = args -> { + try { + return method.invoke(cognationManagerInstances.get(key), args); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + }; + coordinatedMethodsRouterTable.put(key, function); + }); + } catch (Exception e) { + throw new FactoryExecuteFailedException("创建协调方法路由表出错", e); + } + + } + + private HashMap getCognationManagerInstances() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException { + HashMap map = new HashMap<>(); + for (Class c : reflections.getSubTypesOf(BaseCognationManager.class)) { + Constructor constructor = c.getDeclaredConstructor(); + BaseCognationManager instance = constructor.newInstance(); + + Arrays.stream(c.getMethods()) + .filter(method -> method.isAnnotationPresent(Coordinated.class)) + .forEach(method -> { + String key = method.getAnnotation(Coordinated.class).capability() + "." + methodSignature(method); + map.put(key, instance); + }); + } + return map; + } + + private void setBasicVariable(String scannerPath) { + setReflections(scannerPath); + setAnnotatedClasses(); + } + + private void setAnnotatedClasses() { + cores = reflections.getTypesAnnotatedWith(CapabilityCore.class); + capabilities = reflections.getTypesAnnotatedWith(Capability.class); + } + + private void setReflections(String scannerPath) { //后续可替换为根据传入的启动类获取路径 - Collection urls = ClasspathHelper.forJavaClassPath(); - return new Reflections( + Collection urls = ClasspathHelper.forPackage(scannerPath); + reflections = new Reflections( new ConfigurationBuilder() .setUrls(urls) - .setScanners(Scanners.TypesAnnotated, Scanners.MethodsAnnotated, Scanners.SubTypes) + .setScanners( + Scanners.TypesAnnotated, + Scanners.MethodsAnnotated, + Scanners.SubTypes, + Scanners.FieldsAnnotated + ) ); } - public void registerCapabilities() { - //检查可注册能力是否正常 - statusCheck(); - //扫描现有Capability, value为键,返回函数路由表, 函数路由表内部通过反射调用对应core的方法 - //扫描时也需要排除掉 + private void generateMethodsRouterTable() { + //扫描`@Capability`与`@CapabilityMethod`注解的类与方法 + //将`capabilityValue.methodSignature`作为key,函数对象为通过反射拿到的core实例对应的方法 + cores.forEach(core -> Arrays.stream(core.getMethods()) + .filter(method -> method.isAnnotationPresent(CapabilityMethod.class)) + .forEach(method -> { + Function function = args -> { + try { + return method.invoke(capabilityCoreInstances.get(core), args); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + }; + String key = core.getAnnotation(CapabilityCore.class).value() + "." + methodSignature(method); + if (methodsRouterTable.containsKey(key)) { + throw new DuplicateMethodException("重复注册能力方法: " + core.getPackage().getName() + "." + core.getSimpleName() + "#" + method.getName()); + } + methodsRouterTable.put(key, function); + })); + } + + + private void injectCapability() { + //获取现有的`@InjectCapability`注解所在字段,并获取对应的类,通过动态代理注入对象 + Set fields = reflections.getFieldsAnnotatedWith(InjectCapability.class); + //在动态代理内部,通过函数路由表调用对应的方法 + createProxy(fields); + } + + private void createProxy(Set fields) { + try { + for (Field field : fields) { + field.setAccessible(true); + Class fieldType = field.getType(); + Object instance = Proxy.newProxyInstance( + fieldType.getClassLoader(), + new Class[]{fieldType}, + (proxy, method, objects) -> { + if (method.isAnnotationPresent(ToCoordinated.class)) { + String key = method.getDeclaringClass().getAnnotation(Capability.class).value() + "." + methodSignature(method); + return coordinatedMethodsRouterTable.get(key).apply(objects); + } + String key = fieldType.getAnnotation(Capability.class).value() + "." + methodSignature(method); + return methodsRouterTable.get(key).apply(objects); + } + ); + field.set(capabilityHolderInstances.get(field.getDeclaringClass()), instance); + } + } catch (Exception e) { + throw new ProxySetFailedException("代理设置失败", e); + } } private void statusCheck() { - Set> cores = reflections.getTypesAnnotatedWith(CapabilityCore.class); - Set> capabilities = reflections.getTypesAnnotatedWith(Capability.class); - checkCountAndCapabilities(cores, capabilities); - checkCapabilityMethods(cores, capabilities); - checkCoordinatedMethods(capabilities); + capabilityHolderCheck(); + checkCountAndCapabilities(); + checkCapabilityMethods(); + checkCoordinatedMethods(); + checkInjectCapability(); + //检查完毕,设置core的实例类 + setCapabilityCoreInstances(); } - private void checkCoordinatedMethods(Set> capabilities) { + private void checkInjectCapability() { + reflections.getFieldsAnnotatedWith(InjectCapability.class).forEach(field -> { + if (!CapabilityHolder.class.isAssignableFrom(field.getDeclaringClass())) { + throw new UnMatchedCapabilityException("InjectCapability 注解只能用于CapabilityHolder的子类"); + } + }); + } + + private void capabilityHolderCheck() { + if (capabilityHolderInstances.isEmpty()) { + throw new EmptyCapabilityHolderException("Capability 持有者实例为空"); + } + } + + private void setCapabilityCoreInstances() { + try { + for (Class core : cores) { + Constructor constructor = core.getDeclaredConstructor(); + constructor.setAccessible(true); + capabilityCoreInstances.put(core, constructor.newInstance()); + } + } catch (InvocationTargetException | NoSuchMethodException | InstantiationException | + IllegalAccessException e) { + throw new CoreInstancesCreateFailedException("core实例创建失败"); + } + } + + private void checkCoordinatedMethods() { //检查各个capability中是否含有ToCoordinated注解 //如果含有,则需要查找AbstractCognationManager的子类,看这里是否有对应的Coordinated注解所在方法 Set methodsToCoordinated = capabilities.stream() @@ -108,7 +258,7 @@ public class CapabilityRegisterFactory { } - private void checkCapabilityMethods(Set> cores, Set> capabilities) { + private void checkCapabilityMethods() { HashMap> capabilitiesMethods = getCapabilityMethods(capabilities); StringBuilder sb = new StringBuilder(); for (Class core : cores) { @@ -129,11 +279,11 @@ public class CapabilityRegisterFactory { private LackRecord checkMethodsMatched(List methodsWithAnnotation, List capabilityMethods) { Set collectedMethodsWithAnnotation = methodsWithAnnotation.stream() .filter(method -> !method.isAnnotationPresent(ToCoordinated.class)) - .map(this::methodSignature) + .map(CapabilityUtil::methodSignature) .collect(Collectors.toSet()); Set collectedCapabilityMethods = capabilityMethods.stream() .filter(method -> !method.isAnnotationPresent(ToCoordinated.class)) - .map(this::methodSignature) + .map(CapabilityUtil::methodSignature) .collect(Collectors.toSet()); return checkMethodsMatched(collectedMethodsWithAnnotation, collectedCapabilityMethods); } @@ -157,19 +307,6 @@ public class CapabilityRegisterFactory { } - private String methodSignature(Method method) { - StringBuilder sb = new StringBuilder(); - sb.append("("); - sb.append(method.getReturnType().getName()).append(" "); - sb.append(method.getName()).append("("); - Class[] paramTypes = method.getParameterTypes(); - for (int i = 0; i < paramTypes.length; i++) { - sb.append(paramTypes[i].getName()); - if (i < paramTypes.length - 1) sb.append(","); - } - sb.append(")").append(")"); - return sb.toString(); - } private HashMap> getCapabilityMethods(Set> capabilities) { HashMap> capabilityMethods = new HashMap<>(); @@ -179,7 +316,7 @@ public class CapabilityRegisterFactory { return capabilityMethods; } - private void checkCountAndCapabilities(Set> cores, Set> capabilities) { + private void checkCountAndCapabilities() { if (cores.size() != capabilities.size()) { throw new UnMatchedCapabilityException("Capability 注册异常: 已存在的CapabilityCore与Capability数量不匹配!"); } @@ -213,6 +350,10 @@ public class CapabilityRegisterFactory { return coresValues.equals(capabilitiesValues); } + public void registerModule(CapabilityHolder capabilityHolder) { + capabilityHolderInstances.put(capabilityHolder.getClass(), capabilityHolder); + } + record LackRecord(List coreLack, List capLack) { public boolean hasNotEmptyRecord() { return !coreLack.isEmpty() || !capLack.isEmpty(); diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/Capability.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/Capability.java similarity index 88% rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/Capability.java rename to Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/Capability.java index 254157a1..6193e7d8 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/Capability.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/Capability.java @@ -1,4 +1,4 @@ -package work.slhaf.demo.capability.interfaces; +package work.slhaf.demo.capability.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/CapabilityCore.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/CapabilityCore.java similarity index 88% rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/CapabilityCore.java rename to Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/CapabilityCore.java index 6c213f54..027d808a 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/CapabilityCore.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/CapabilityCore.java @@ -1,4 +1,4 @@ -package work.slhaf.demo.capability.interfaces; +package work.slhaf.demo.capability.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/CapabilityMethod.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/CapabilityMethod.java similarity index 84% rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/CapabilityMethod.java rename to Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/CapabilityMethod.java index 6fa6bc18..2365986f 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/CapabilityMethod.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/CapabilityMethod.java @@ -1,4 +1,4 @@ -package work.slhaf.demo.capability.interfaces; +package work.slhaf.demo.capability.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/Coordinated.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/Coordinated.java similarity index 88% rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/Coordinated.java rename to Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/Coordinated.java index d5a60d8b..8e8f3e50 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/Coordinated.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/Coordinated.java @@ -1,4 +1,4 @@ -package work.slhaf.demo.capability.interfaces; +package work.slhaf.demo.capability.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/InjectCapability.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/InjectCapability.java similarity index 86% rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/InjectCapability.java rename to Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/InjectCapability.java index 564ad91e..c71c74a6 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/InjectCapability.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/InjectCapability.java @@ -1,4 +1,4 @@ -package work.slhaf.demo.capability.interfaces; +package work.slhaf.demo.capability.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/ToCoordinated.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/ToCoordinated.java similarity index 91% rename from Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/ToCoordinated.java rename to Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/ToCoordinated.java index 3f017760..08add8c3 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/interfaces/ToCoordinated.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/annotation/ToCoordinated.java @@ -1,4 +1,4 @@ -package work.slhaf.demo.capability.interfaces; +package work.slhaf.demo.capability.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/CapabilityCheckFailedException.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/CapabilityCheckFailedException.java index 4d38c32f..b0f43655 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/CapabilityCheckFailedException.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/CapabilityCheckFailedException.java @@ -2,6 +2,10 @@ package work.slhaf.demo.capability.exception; public class CapabilityCheckFailedException extends RuntimeException { public CapabilityCheckFailedException(String message) { - super("Capability注册失败: "+message); + super("Capability注册失败: " + message); + } + + public CapabilityCheckFailedException(String message, Throwable cause) { + super("Capability注册失败: " + message, cause); } } diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/CoreInstancesCreateFailedException.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/CoreInstancesCreateFailedException.java new file mode 100644 index 00000000..71aed8aa --- /dev/null +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/CoreInstancesCreateFailedException.java @@ -0,0 +1,11 @@ +package work.slhaf.demo.capability.exception; + +public class CoreInstancesCreateFailedException extends FactoryExecuteFailedException{ + public CoreInstancesCreateFailedException(String message) { + super(message); + } + + public CoreInstancesCreateFailedException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/DuplicateCapabilityException.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/DuplicateCapabilityException.java index 1661a086..6d92d16b 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/DuplicateCapabilityException.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/DuplicateCapabilityException.java @@ -4,4 +4,8 @@ public class DuplicateCapabilityException extends CapabilityCheckFailedException public DuplicateCapabilityException(String message) { super(message); } + + public DuplicateCapabilityException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/DuplicateMethodException.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/DuplicateMethodException.java new file mode 100644 index 00000000..0866ff40 --- /dev/null +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/DuplicateMethodException.java @@ -0,0 +1,11 @@ +package work.slhaf.demo.capability.exception; + +public class DuplicateMethodException extends CapabilityCheckFailedException{ + public DuplicateMethodException(String message) { + super(message); + } + + public DuplicateMethodException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/EmptyCapabilityHolderException.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/EmptyCapabilityHolderException.java new file mode 100644 index 00000000..f6de1273 --- /dev/null +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/EmptyCapabilityHolderException.java @@ -0,0 +1,11 @@ +package work.slhaf.demo.capability.exception; + +public class EmptyCapabilityHolderException extends CapabilityCheckFailedException{ + public EmptyCapabilityHolderException(String message) { + super(message); + } + + public EmptyCapabilityHolderException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/FactoryExecuteFailedException.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/FactoryExecuteFailedException.java new file mode 100644 index 00000000..93507eb2 --- /dev/null +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/FactoryExecuteFailedException.java @@ -0,0 +1,11 @@ +package work.slhaf.demo.capability.exception; + +public class FactoryExecuteFailedException extends RuntimeException { + public FactoryExecuteFailedException(String message) { + super("CapabilityRegisterFactory 执行失败: " + message); + } + + public FactoryExecuteFailedException(String message, Throwable cause) { + super("CapabilityRegisterFactory 执行失败: " + message, cause); + } +} diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/ProxySetFailedException.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/ProxySetFailedException.java new file mode 100644 index 00000000..ca4e33f6 --- /dev/null +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/ProxySetFailedException.java @@ -0,0 +1,11 @@ +package work.slhaf.demo.capability.exception; + +public class ProxySetFailedException extends FactoryExecuteFailedException{ + public ProxySetFailedException(String message) { + super(message); + } + + public ProxySetFailedException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCapabilityException.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCapabilityException.java index 83415ff9..f0467df7 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCapabilityException.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCapabilityException.java @@ -4,4 +4,8 @@ public class UnMatchedCapabilityException extends CapabilityCheckFailedException public UnMatchedCapabilityException(String message) { super(message); } + + public UnMatchedCapabilityException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCapabilityMethodException.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCapabilityMethodException.java index a7894eb6..a90c6568 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCapabilityMethodException.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCapabilityMethodException.java @@ -4,4 +4,8 @@ public class UnMatchedCapabilityMethodException extends CapabilityCheckFailedExc public UnMatchedCapabilityMethodException(String message) { super(message); } + + public UnMatchedCapabilityMethodException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCoordinatedMethodException.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCoordinatedMethodException.java index 528c0aad..148a324f 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCoordinatedMethodException.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/exception/UnMatchedCoordinatedMethodException.java @@ -4,4 +4,8 @@ public class UnMatchedCoordinatedMethodException extends CapabilityCheckFailedEx public UnMatchedCoordinatedMethodException(String message) { super(message); } + + public UnMatchedCoordinatedMethodException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/module/CapabilityHolder.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/module/CapabilityHolder.java new file mode 100644 index 00000000..5bd702ab --- /dev/null +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/module/CapabilityHolder.java @@ -0,0 +1,9 @@ +package work.slhaf.demo.capability.module; + +import work.slhaf.demo.capability.CapabilityRegisterFactory; + +public abstract class CapabilityHolder { + protected CapabilityHolder(){ + CapabilityRegisterFactory.getInstance().registerModule(this); + } +} diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/util/CapabilityUtil.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/util/CapabilityUtil.java new file mode 100644 index 00000000..dc13868a --- /dev/null +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/capability/util/CapabilityUtil.java @@ -0,0 +1,19 @@ +package work.slhaf.demo.capability.util; + +import java.lang.reflect.Method; + +public final class CapabilityUtil { + public static String methodSignature(Method method) { + StringBuilder sb = new StringBuilder(); + sb.append("("); + sb.append(method.getReturnType().getName()).append(" "); + sb.append(method.getName()).append("("); + Class[] paramTypes = method.getParameterTypes(); + for (int i = 0; i < paramTypes.length; i++) { + sb.append(paramTypes[i].getName()); + if (i < paramTypes.length - 1) sb.append(","); + } + sb.append(")").append(")"); + return sb.toString(); + } +} diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/CacheCore.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/CacheCore.java index ee53bf72..49aef79f 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/CacheCore.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/CacheCore.java @@ -1,8 +1,8 @@ package work.slhaf.demo.core; import lombok.extern.slf4j.Slf4j; -import work.slhaf.demo.capability.interfaces.CapabilityCore; -import work.slhaf.demo.capability.interfaces.CapabilityMethod; +import work.slhaf.demo.capability.annotation.CapabilityCore; +import work.slhaf.demo.capability.annotation.CapabilityMethod; import java.time.LocalDateTime; import java.util.HashMap; @@ -14,14 +14,11 @@ public class CacheCore { public static volatile CacheCore cacheCore; + private CacheCore() { + cacheCore = this; + } + public static CacheCore getInstance() { - if (cacheCore == null) { - synchronized (CacheCore.class) { - if (cacheCore == null) { - cacheCore = new CacheCore(); - } - } - } return cacheCore; } @@ -49,9 +46,9 @@ public class CacheCore { } @CapabilityMethod - public String getUserDialogMapStr(String userId) { + public String getUserDialogMapStr(String userId,int id) { log.info("cache: getUserDialogMapStr"); - return ""; + return userId+id; } } diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/MemoryCore.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/MemoryCore.java index 2173ab34..dd557d33 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/MemoryCore.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/MemoryCore.java @@ -1,8 +1,8 @@ package work.slhaf.demo.core; import lombok.extern.slf4j.Slf4j; -import work.slhaf.demo.capability.interfaces.CapabilityCore; -import work.slhaf.demo.capability.interfaces.CapabilityMethod; +import work.slhaf.demo.capability.annotation.CapabilityCore; +import work.slhaf.demo.capability.annotation.CapabilityMethod; import java.util.ArrayList; import java.util.List; @@ -13,14 +13,11 @@ public class MemoryCore { public static volatile MemoryCore memoryCore; + private MemoryCore() { + memoryCore = this; + } + public static MemoryCore getInstance() { - if (memoryCore == null){ - synchronized (MemoryCore.class){ - if (memoryCore == null){ - memoryCore = new MemoryCore(); - } - } - } return memoryCore; } diff --git a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/PerceiveCore.java b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/PerceiveCore.java index 0791ddfe..dd082ff3 100644 --- a/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/PerceiveCore.java +++ b/Partner-Capability-Demo/src/main/java/work/slhaf/demo/core/PerceiveCore.java @@ -1,8 +1,8 @@ package work.slhaf.demo.core; import lombok.extern.slf4j.Slf4j; -import work.slhaf.demo.capability.interfaces.CapabilityCore; -import work.slhaf.demo.capability.interfaces.CapabilityMethod; +import work.slhaf.demo.capability.annotation.CapabilityCore; +import work.slhaf.demo.capability.annotation.CapabilityMethod; @CapabilityCore(value = "perceive") @Slf4j @@ -10,14 +10,11 @@ public class PerceiveCore { public static volatile PerceiveCore perceiveCore; + private PerceiveCore() { + perceiveCore = this; + } + public static PerceiveCore getInstance() { - if (perceiveCore == null){ - synchronized (PerceiveCore.class){ - if (perceiveCore == null){ - perceiveCore = new PerceiveCore(); - } - } - } return perceiveCore; } diff --git a/Partner-Capability-Demo/src/test/java/FunctionRouterTest.java b/Partner-Capability-Demo/src/test/java/FunctionRouterTest.java new file mode 100644 index 00000000..38d8f566 --- /dev/null +++ b/Partner-Capability-Demo/src/test/java/FunctionRouterTest.java @@ -0,0 +1,15 @@ +import org.junit.jupiter.api.Test; +import work.slhaf.demo.ability.CacheCapability; +import work.slhaf.demo.capability.annotation.InjectCapability; + +public class FunctionRouterTest { + + @InjectCapability + private CacheCapability cache; + + @Test + public void test(){ + cache.getUserDialogMapStr("123",111); + } + +}