refactor(framework): add component annotation validation before component registration

This commit is contained in:
2026-02-21 19:27:17 +08:00
parent 3c26e77b76
commit 833fe4deb3
2 changed files with 50 additions and 3 deletions

View File

@@ -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.CapabilityCheckFactory;
import work.slhaf.partner.api.agent.factory.capability.CapabilityInjectFactory; 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.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.component.ModuleInitHookExecuteFactory;
import work.slhaf.partner.api.agent.factory.config.ConfigLoaderFactory; import work.slhaf.partner.api.agent.factory.config.ConfigLoaderFactory;
import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext; import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext;
@@ -38,8 +39,10 @@ public class AgentRegisterFactory {
//流程 //流程
//0. 加载配置 //0. 加载配置
new ConfigLoaderFactory().execute(registerContext); new ConfigLoaderFactory().execute(registerContext);
//1. 收集所有的 AgentComponent 实例 //1. 校验 Component 级别注解是否合规,避免注入到异常位置
new AgentComponentRegisterFactory().execute(registerContext); new ComponentAnnotationValidatorFactory().execute(registerContext);
//2. 收集所有的 AgentComponent 实例
new ComponentRegisterFactory().execute(registerContext);
//3. 加载检查Capability层内容后进行能力层的内容注册 //3. 加载检查Capability层内容后进行能力层的内容注册
new CapabilityCheckFactory().execute(registerContext); new CapabilityCheckFactory().execute(registerContext);
new CapabilityRegisterFactory().execute(registerContext); new CapabilityRegisterFactory().execute(registerContext);

View File

@@ -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}"
)
}
}
}
}