Загрузка компонентов / классов в ArrayList через шаблон имени некоторого компонента - PullRequest
1 голос
/ 02 октября 2011

У меня есть несколько классов одного типа (com.project.abc.abs.Agent), помеченных так:

@Component("WEB.Agent-1"), @Component("WEB.Agent-2"), @Component("WEB.Agent-3") ... и т. Д. Теперь предположим, что все классы находятся в одном пакете (com.project.abc.web.Agent1...).

Все эти классы являются синглетонами, и я хочу динамически загрузить их в центральный класс 'Диспетчер агентов'. То есть каждый раз, когда добавляется новый класс агента с аннотацией @Component("WEB.Agent-#"), он выбирается без необходимости вносить изменения в диспетчер агентов. В классе AgentManager мне нужен какой-то метод для загрузки любого компонента, который соответствует имени «WEB.Agent- #» (где # - число или некоторый уникальный идентификатор). Возможно ли это с помощью любых методов в Spring?

Если нет, то я предполагаю, что мне нужно было бы загрузить все классы из определенной папки / пакета?

1 Ответ

1 голос
/ 02 октября 2011

Вы можете сделать это с помощью ClassPathScanningCandidateComponentProvider и добавить фильтр исключения, который избавляет от вещей, которые не соответствуют вашему шаблону:

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());
...