Mit Spring den Classpath durchsuchen

Für eine Plugin-Engine musste ich heute den Classpath nach Klassen durchsuchen, die von einer abstrakten Plugin-Klasse erben. Von den gefundenen Klassen sollte aber keine Instanz erzeugt werden, eine Erweiterung des <context:component-scan> kam daher nicht in Frage. Die Lösung für das Problem ist die Klasse ClassPathScanningCandidateComponentProvider:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class PluginRegistry {

    @SuppressWarnings("unchecked")
    public static Set<Class<? extends AbstractPlugin>> getAvailablePlugins() {

        ClassPathScanningCandidateComponentProvider componentProvider = new ClassPathScanningCandidateComponentProvider(false);
        componentProvider.addIncludeFilter(new AssignableTypeFilter(AbstractPlugin.class));

        Collection beanDefinitions = componentProvider.findCandidateComponents("my.plugins.package");

        Set<Class<? extends AbstractPlugin>> set = new HashSet<Class<? extends AbstractPlugin>>();

        for(BeanDefinition beanDefinition : beanDefinitions){
            try {
                set.add((Class<? extends AbstractPlugin>) Class.forName(beanDefinition.getBeanClassName()));
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }

        return set;
    }

}

Diese Lösung benötigt keinen Spring-Context. Oliver Gierke hat mir den entscheidenen Hinweis auf den ClassPathScanningCandidateComponentProvider gegeben, vielen Dank!

Letzte Aktualisierung: 2012-12-07 15:59:06