Java 通过组件名模式将组件/类加载到ArrayList中
我有许多相同类型的类(Java 通过组件名模式将组件/类加载到ArrayList中,java,spring,singleton,components,classloader,Java,Spring,Singleton,Components,Classloader,我有许多相同类型的类(com.project.abc.abs.Agent)这样注释 @Component(“WEB.Agent-1”)、@Component(“WEB.Agent-2”)、@Component(“WEB.Agent-3”)。。。现在假设所有类都在同一个包中(com.project.abc.web.Agent1…) 这些类都是单例的,我想动态地将它们加载到一个中央“代理管理器”类中。也就是说,每次使用@组件(“WEB.agent-#”)添加一个新的代理类时,注释都会被拾取,而无需对
com.project.abc.abs.Agent
)这样注释
@Component(“WEB.Agent-1”)、@Component(“WEB.Agent-2”)、@Component(“WEB.Agent-3”)
。。。现在假设所有类都在同一个包中(com.project.abc.web.Agent1…
)
这些类都是单例的,我想动态地将它们加载到一个中央“代理管理器”类中。也就是说,每次使用@组件(“WEB.agent-#”)添加一个新的代理类时,
注释都会被拾取,而无需对代理管理器进行更改。在AgentManager类中,我需要一些方法来加载与名称“WEB.Agent-#”(其中#是一个数字或某个唯一ID)匹配的任何组件。这是否可以在Spring中使用任何方法
如果不是,我假设我需要从特定文件夹/包加载所有类?您可以使用并添加排除过滤器,以消除与您的模式不匹配的内容:
ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider();
scanner.addIncludeFilter(new AnnotationTypeFilter(Component.class));
scanner.addExcludeFilter(new TypeFilter(){
public boolean match(MetadataReader metadataReader,
MetadataReaderFactory metadataReaderFactory){
return metadataReader.getAnnotationMetadata()
.getAnnotationAttributes(Component.class.getName())
.get("value").matches("WEB.Agent-[0-9]+");
}
});
for (BeanDefinition bd : scanner.findCandidateComponents("com.project.abc.web.Agent1"))
System.out.println(bd.getBeanClassName());
您可以使用并添加排除过滤器来消除与您的模式不匹配的内容:
ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider();
scanner.addIncludeFilter(new AnnotationTypeFilter(Component.class));
scanner.addExcludeFilter(new TypeFilter(){
public boolean match(MetadataReader metadataReader,
MetadataReaderFactory metadataReaderFactory){
return metadataReader.getAnnotationMetadata()
.getAnnotationAttributes(Component.class.getName())
.get("value").matches("WEB.Agent-[0-9]+");
}
});
for (BeanDefinition bd : scanner.findCandidateComponents("com.project.abc.web.Agent1"))
System.out.println(bd.getBeanClassName());
感谢Mark,如果
.getAnnotationAttributes()
是.getAnnotationAttributes(“组件”)的话,那么它似乎需要一个字符串参数
?当运行for循环时,我得到一个错误org.springframework.beans.factory.BeanDefinitionStoreException:未能读取候选组件类:文件
@NightWolf,我认为您需要指定component.class.getName()
(完全限定的类型名)。谢谢标记,似乎.getAnnotationAttributes()
需要一个字符串参数,如果这是.getAnnotationAttributes(“组件”)
?在for循环中运行时,我得到一个错误org.springframework.beans.factory.BeanDefinitionStoreException:未能读取候选组件类:文件
@NightWolf,我认为您需要指定Component.class.getName()
(完全限定类型名)。