2012-03-09 3 views
3

Есть ли способ получить список всех контроллеров, которые были аннотированы с помощью @Controller? Я бы хотел (а) использовать их как:Получение всех аннотированных контроллеров с помощью @Controller

@Autowired 
public void addAll(List<Controller> controllers) throws Exception { 
    for (Controller controller : controllers) { 
     ... 
    } 
} 

Спасибо!

+3

Я заинтересован в том, почему вы хотели бы это сделать? Просто любопытно. – aglassman

+0

Обратите внимание, что классы, аннотированные с помощью @Controller, не обязательно имеют общую родословную, кроме java.lang.Object. –

+0

@aglassman для создания документации? – NimChimpsky

ответ

15

getBeansWithAnnotation()

Если вы аннотированный их с контроллером ...:

@Autowired 
private ListableBeanFactory listableBeanFactory; 

затем

Map<String, Object> controllers; 
controllers = listableBeanFactory.getBeansWithAnnotation(Controller.class); 
2
  1. Вы, вероятно, можете также использовать тот факт, что <context-component:scan /> и BeanFactory делают большинство из этого для вас. @NimChimpsky - отличный пример.

  2. Вы можете сканировать классам, используя либо

public List<Class> scanForComponents() { 
    List<Class> components = new LinkedList<Class>(); 
    ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); 
    scanner.addIncludeFilter(new AnnotationTypeFilter(Component.class)); 

    for (String componentBasePacke : componentBasePackages) { 
     for (BeanDefinition bd : scanner.findCandidateComponents(componentBasePacke)) { 
      try { 
       components.add(Class.forName(bd.getBeanClassName())); 
      } catch (ClassNotFoundException ex) { 
      } 
     } 
    } 

    return components; 
} 
Смежные вопросы