diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java index 18da4e3a..445c9b76 100644 --- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java +++ b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/AgentRegisterFactory.java @@ -4,7 +4,8 @@ import org.reflections.util.ClasspathHelper; import work.slhaf.partner.api.agent.factory.capability.CapabilityCheckFactory; import work.slhaf.partner.api.agent.factory.capability.CapabilityInjectFactory; import work.slhaf.partner.api.agent.factory.capability.CapabilityRegisterFactory; -import work.slhaf.partner.api.agent.factory.component.AgentComponentRegisterFactory; +import work.slhaf.partner.api.agent.factory.component.ComponentAnnotationValidatorFactory; +import work.slhaf.partner.api.agent.factory.component.ComponentRegisterFactory; import work.slhaf.partner.api.agent.factory.component.ModuleInitHookExecuteFactory; import work.slhaf.partner.api.agent.factory.config.ConfigLoaderFactory; import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext; @@ -38,8 +39,10 @@ public class AgentRegisterFactory { //流程 //0. 加载配置 new ConfigLoaderFactory().execute(registerContext); - //1. 收集所有的 AgentComponent 实例 - new AgentComponentRegisterFactory().execute(registerContext); + //1. 校验 Component 级别注解是否合规,避免注入到异常位置 + new ComponentAnnotationValidatorFactory().execute(registerContext); + //2. 收集所有的 AgentComponent 实例 + new ComponentRegisterFactory().execute(registerContext); //3. 加载检查Capability层内容后进行能力层的内容注册 new CapabilityCheckFactory().execute(registerContext); new CapabilityRegisterFactory().execute(registerContext); diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/component/ComponentAnnotationValidatorFactory.kt b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/component/ComponentAnnotationValidatorFactory.kt new file mode 100644 index 00000000..24c33e04 --- /dev/null +++ b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/component/ComponentAnnotationValidatorFactory.kt @@ -0,0 +1,44 @@ +package work.slhaf.partner.api.agent.factory.component + +import work.slhaf.partner.api.agent.factory.AgentBaseFactory +import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule +import work.slhaf.partner.api.agent.factory.component.annotation.AgentComponent +import work.slhaf.partner.api.agent.factory.component.annotation.Init +import work.slhaf.partner.api.agent.factory.component.annotation.InjectModule +import work.slhaf.partner.api.agent.factory.component.exception.ModuleCheckException +import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext +import work.slhaf.partner.api.agent.util.AgentUtil + +class ComponentAnnotationValidatorFactory : AgentBaseFactory() { + override fun execute(context: AgentRegisterContext) { + val reflections = context.reflections + + reflections.getMethodsAnnotatedWith(Init::class.java) + .forEach { method -> + val declaringClass = method.declaringClass + if (!AgentUtil.isAssignableFromAnnotation(declaringClass, AgentComponent::class.java)) { + throw ModuleCheckException( + "@Init 只能用于 AgentComponent 中: " + + "${declaringClass.name}#${method.name}" + ) + } + } + + reflections.getFieldsAnnotatedWith(InjectModule::class.java) + .forEach { field -> + val declaringClass = field.declaringClass + if (!AgentUtil.isAssignableFromAnnotation(declaringClass, AgentComponent::class.java)) { + throw ModuleCheckException( + "@InjectModule 只能用于 AgentComponent 中: " + + "${declaringClass.name}#${field.name}" + ) + } + if (AbstractAgentModule.Running::class.java.isAssignableFrom(field.type)) { + throw ModuleCheckException( + "@InjectModule 不可注入 AbstractAgentModule.Running 子类: " + + "${declaringClass.name}#${field.name} -> ${field.type.name}" + ) + } + } + } +}