mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 16:53:04 +08:00
refactor(framework): add component annotation validation before component registration
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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}"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user