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()
(完全限定类型名)。