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!