package de.invesdwin.util.classpath; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.annotation.concurrent.NotThreadSafe; import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.filter.TypeFilter; @NotThreadSafe public class ClassPathScanner extends org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider { private static List<TypeFilter> defaultExcludeFilters = new ArrayList<TypeFilter>(); private boolean interfacesOnly; public ClassPathScanner() { super(false); for (final TypeFilter typeFilter : defaultExcludeFilters) { addExcludeFilter(typeFilter); } //see http://stackoverflow.com/questions/8807388/using-classpathscanningcandidatecomponentprovider-with-multiple-jar-files setResourceLoader(new PathMatchingResourcePatternResolver(getClass().getClassLoader())); } public static void setDefaultExcludeFilters(final List<TypeFilter> defaultExcludeFilters) { ClassPathScanner.defaultExcludeFilters = defaultExcludeFilters; } public static List<TypeFilter> getDefaultExcludeFilters() { return ClassPathScanner.defaultExcludeFilters; } @Override protected boolean isCandidateComponent(final AnnotatedBeanDefinition beanDefinition) { if (interfacesOnly) { return beanDefinition.getMetadata().isInterface(); } else { return super.isCandidateComponent(beanDefinition); } } @Override protected boolean isCandidateComponent(final MetadataReader metadataReader) throws IOException { return super.isCandidateComponent(metadataReader); } public ClassPathScanner withInterfacesOnly() { interfacesOnly = true; return this; } public boolean isInterfacesOnly() { return interfacesOnly; } }