diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/Agent.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/Agent.java
index 45d4fc5c..a9cb8756 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/Agent.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/Agent.java
@@ -12,6 +12,10 @@ import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+/**
+ *
Agent 启动入口
+ * 详细启动流程请参阅{@link AgentRegisterFactory}
+ */
public final class Agent {
public static AgentGatewayStep newAgent(Class> clazz) {
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java
index d84da9cd..472ddb3b 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java
@@ -16,12 +16,20 @@ import work.slhaf.partner.api.agent.factory.module.ModuleRegisterFactory;
import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule;
import work.slhaf.partner.api.agent.runtime.data.AgentContext;
import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager;
+import work.slhaf.partner.api.agent.runtime.interaction.flow.AgentRunningFlow;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
+/**
+ * Agent 注册工厂
+ *
+ *
+ * 具体流程依次按照 {@link AgentRegisterFactory#launch(String)} 方法顺序执行,最终将执行模块列表对应实例交给 {@link AgentConfigManager} ,传递给 {@link AgentRunningFlow} 针对交互做出调用
+ *
+ */
public class AgentRegisterFactory {
private static final List urls = new ArrayList<>();
@@ -35,14 +43,14 @@ public class AgentRegisterFactory {
//流程
//0. 加载配置
new ConfigLoaderFactory().execute(registerContext);
- //1. 注册并检查Capability
- new CapabilityRegisterFactory().execute(registerContext);
- new CapabilityCheckFactory().execute(registerContext);
- //2. 注册并检查Module
+ //1. 注册并检查Module
new ModuleCheckFactory().execute(registerContext);
new ModuleRegisterFactory().execute(registerContext);
- //3. 为module通过动态代理添加PostHook逻辑并进行实例化
+ //2. 为module通过动态代理添加PostHook逻辑并进行实例化
new ModuleProxyFactory().execute(registerContext);
+ //3. 加载检查Capability层内容后进行能力层的内容注册
+ new CapabilityCheckFactory().execute(registerContext);
+ new CapabilityRegisterFactory().execute(registerContext);
//. 先一步注入Capability,避免因前hook逻辑存在针对能力的引用而报错
new CapabilityInjectFactory().execute(registerContext);
//. 执行模块PreHook逻辑
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityCheckFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityCheckFactory.java
index 5021e59b..00d59a0b 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityCheckFactory.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityCheckFactory.java
@@ -9,6 +9,9 @@ import work.slhaf.partner.api.agent.factory.capability.exception.UnMatchedCapabi
import work.slhaf.partner.api.agent.factory.capability.exception.UnMatchedCoordinatedMethodException;
import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext;
import work.slhaf.partner.api.agent.factory.context.CapabilityFactoryContext;
+import work.slhaf.partner.api.agent.factory.module.ModuleCheckFactory;
+import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule;
+import work.slhaf.partner.api.agent.factory.module.annotation.AgentSubModule;
import work.slhaf.partner.api.agent.util.AgentUtil;
import java.lang.reflect.Method;
@@ -18,7 +21,34 @@ import java.util.stream.Collectors;
import static work.slhaf.partner.api.agent.util.AgentUtil.methodSignature;
/**
- * 执行Capability相关检查
+ * Agent启动流程 4
+ *
+ * 负责通过反射收集 {@link Capability} 和 {@link CapabilityCore} 注解所在类,并判断是否存在被错误忽略的方法
+ *
+ *
+ * -
+ *
{@link CapabilityCheckFactory#loadCoresAndCapabilities()}
+ * 通过反射收集 {@link Capability} 和 {@link CapabilityCore} 注解所在类为对应集合
+ *
+ * -
+ *
{@link CapabilityCheckFactory#checkCountAndCapabilities()}
+ * 检测 {@link Capability} 与 {@link CapabilityCore} 的数量、对应的能力是否相等。每一个core都将对应一个capability,并通过value属性进行匹配
+ *
+ * -
+ *
{@link CapabilityCheckFactory#checkCapabilityMethods()}
+ * 检测在 {@link Capability} 与 {@link CapabilityCore} 中是否存在对方尚未实现/注册的方法
+ *
+ * -
+ *
{@link CapabilityCheckFactory#checkCoordinatedMethods()}
+ * 检查是否包含协调方法({@link ToCoordinated}),如果存在,则进一步检查在 {@link CoordinateManager} 所注类中是否有提供对应的实现
+ *
+ * -
+ *
{@link CapabilityCheckFactory#checkInjectCapability()}
+ * 检查 {@link InjectCapability} 注解是否只用在 {@link CapabilityHolder} 所标识类的字段上。{@link AgentModule} 与 {@link AgentSubModule} 已经被 {@link CapabilityHolder} 标注
+ *
+ *
+ *
+ * 下一步流程请参阅{@link CapabilityRegisterFactory}
*/
public class CapabilityCheckFactory extends AgentBaseFactory {
@@ -37,12 +67,18 @@ public class CapabilityCheckFactory extends AgentBaseFactory {
@Override
protected void run() {
+ loadCoresAndCapabilities();
checkCountAndCapabilities();
checkCapabilityMethods();
checkCoordinatedMethods();
checkInjectCapability();
}
+ private void loadCoresAndCapabilities() {
+ cores.addAll(reflections.getTypesAnnotatedWith(CapabilityCore.class));
+ capabilities.addAll(reflections.getTypesAnnotatedWith(Capability.class));
+ }
+
/**
* 检查@InjectCapability注解是否只用在@CapabilityHolder所标识类的字段上
*/
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityInjectFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityInjectFactory.java
index 5d7a7b50..23fb6092 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityInjectFactory.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityInjectFactory.java
@@ -8,6 +8,9 @@ import work.slhaf.partner.api.agent.factory.capability.annotation.ToCoordinated;
import work.slhaf.partner.api.agent.factory.capability.exception.ProxySetFailedExceptionCapability;
import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext;
import work.slhaf.partner.api.agent.factory.context.CapabilityFactoryContext;
+import work.slhaf.partner.api.agent.factory.module.ModuleInitHookExecuteFactory;
+import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule;
+import work.slhaf.partner.api.agent.factory.module.annotation.AgentSubModule;
import java.lang.reflect.Field;
import java.lang.reflect.Proxy;
@@ -18,9 +21,23 @@ import java.util.function.Function;
import static work.slhaf.partner.api.agent.util.AgentUtil.methodSignature;
/**
- * 负责执行Capability的注入逻辑
- */
-public class CapabilityInjectFactory extends AgentBaseFactory {
+ * Agent启动流程 6
+ *
+ * 负责执行 {@link Capability} 的注入逻辑。
+ *
+ * 实现方式:
+ *
+ * - 通过动态代理,为 {@link AgentModule} 与 {@link AgentSubModule} 中待注入的
+ * 能力接口 类型(即 {@link Capability} 标注的接口类)生成代理对象。
+ *
+ * - 在代理对象内部,根据调用方法的签名确定路由,将调用转发至对应的具体函数。
+ *
+ * - 通过此机制,实现了 {@link Capability} 单一语义层面上普通方法与协调方法的统一入口。
+ *
+ *
+ *
+ * 下一步流程请参阅 {@link ModuleInitHookExecuteFactory}
+ */public class CapabilityInjectFactory extends AgentBaseFactory {
private Reflections reflections;
private HashMap> coordinatedMethodsRouterTable;
diff --git a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityRegisterFactory.java b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityRegisterFactory.java
index f2982e6d..7edb1148 100644
--- a/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityRegisterFactory.java
+++ b/Partner-Api/src/main/java/work/slhaf/partner/api/agent/factory/capability/CapabilityRegisterFactory.java
@@ -8,6 +8,8 @@ import work.slhaf.partner.api.agent.factory.capability.exception.CoreInstancesCr
import work.slhaf.partner.api.agent.factory.capability.exception.DuplicateMethodException;
import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext;
import work.slhaf.partner.api.agent.factory.context.CapabilityFactoryContext;
+import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule;
+import work.slhaf.partner.api.agent.factory.module.annotation.AgentSubModule;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -17,19 +19,48 @@ import java.util.HashMap;
import java.util.Set;
import java.util.function.Function;
-import static cn.hutool.core.util.ClassUtil.isNormalClass;
import static work.slhaf.partner.api.agent.util.AgentUtil.methodSignature;
/**
- * 负责获取@Capability和@CapabilityCore标识的类,并生成函数路由表、设置Core实例用于后续注入
+ * Agent启动流程 5
+ *
+ *
+ * 负责收集注解 {@link Capability} 和 {@link CapabilityCore} 标识的类,并生成函数路由表、创建core、capability实例,以及放入instanceMap供后续进行注入操作
+ *
+ *
+ *
+ * -
+ *
{@link CapabilityRegisterFactory#setCoreInstances()}
+ * 通过反射调用无参构造函数创建core实例,并将实例放入instanceMap供后续使用
+ *
+ * -
+ *
{@link CapabilityRegisterFactory#generateRouterTable()}
+ * 生成函数路由表:
+ *
+ *
+ * -
+ * 函数路由表生成完毕、core实例创建完毕之后,将交由下一工厂完成能力(Capability)注入操作,注入到 {@link AgentModule} 与 {@link AgentSubModule} 对应的实例中
+ *
+ *
+ *
+ * 下一步流程请参阅{@link CapabilityInjectFactory}
*/
-public final class CapabilityRegisterFactory extends AgentBaseFactory {
+public class CapabilityRegisterFactory extends AgentBaseFactory {
private Reflections reflections;
private HashMap> methodsRouterTable;
private HashMap> coordinatedMethodsRouterTable;
- private HashMap, Object> capabilityCoreInstances;
+ private HashMap, Object> coreInstances;
private HashMap, Object> capabilityHolderInstances;
private Set> cores;
private Set> capabilities;
@@ -40,38 +71,18 @@ public final class CapabilityRegisterFactory extends AgentBaseFactory {
reflections = context.getReflections();
methodsRouterTable = factoryContext.getMethodsRouterTable();
coordinatedMethodsRouterTable = factoryContext.getCoordinatedMethodsRouterTable();
- capabilityCoreInstances = factoryContext.getCapabilityCoreInstances();
+ coreInstances = factoryContext.getCapabilityCoreInstances();
cores = factoryContext.getCores();
capabilities = factoryContext.getCapabilities();
capabilityHolderInstances = factoryContext.getCapabilityHolderInstances();
}
@Override
- protected void run() throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
- setCapabilityCoreInstances();
- setAnnotatedClasses();
+ protected void run() {
+ setCoreInstances();
generateRouterTable();
}
- /**
- * 设置CapabilityCore、Capability注解标识类
- */
- private void setAnnotatedClasses() throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
- cores.addAll(reflections.getTypesAnnotatedWith(CapabilityCore.class));
- capabilities.addAll(reflections.getTypesAnnotatedWith(Capability.class));
- setCapabilityHolderInstances();
- }
-
- private void setCapabilityHolderInstances() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
- for (Class> clazz : reflections.getTypesAnnotatedWith(CapabilityHolder.class)) {
- if (!isNormalClass(clazz)){
- continue;
- }
- Object o = clazz.getDeclaredConstructor().newInstance();
- capabilityHolderInstances.put(clazz, o);
- }
- }
-
/**
* 生成函数路由表
*/
@@ -128,17 +139,16 @@ public final class CapabilityRegisterFactory extends AgentBaseFactory {
}
/**
- * 生成普通方法对应的函数路由表
+ * 扫描`@Capability`与`@CapabilityMethod`注解的类与方法
+ * 将`capabilityValue.methodSignature`作为key,函数对象为通过反射拿到的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