from:http://www.iteye.com/topic/203267
参考spring2.5里面的component-scan功能,提炼出这样一个工具类,此类依赖spring但不依赖spring容器,请注意此类搜索不到jdk的包如java.lang
-
import
java.io.IOException; -
import
java.lang.annotation.Annotation; -
import
java.util.HashSet; -
import
java.util.LinkedList; -
import
java.util.List; -
import
java.util.Set; -
import
org.springframework.beans.factory.BeanDefinitionStoreException; -
import
org.springframework.context.ResourceLoaderAware; -
import
org.springframework.core.io.Resource; -
import
org.springframework.core.io.ResourceLoader; -
import
org.springframework.core.io.support.PathMatchingResourcePatternResolver; -
import
org.springframework.core.io.support.
ResourcePatternResolver
; -
import
org.springframework.core.io.support.ResourcePatternUtils; -
import
org.springframework.core.type.classreading.CachingMetadataReaderFactory; -
import
org.springframework.core.type.classreading.MetadataReader; -
import
org.springframework.core.type.classreading.MetadataReaderFactory; -
import
org.springframework.core.type.filter.AnnotationTypeFilter; -
import
org.springframework.core.type.filter.TypeFilter; -
import
org.springframework.util.SystemPropertyUtils; -
public
class
ClassScaner
implements
ResourceLoaderAware { -
private
ResourcePatternResolver
resourcePatternResolver
=
new
PathMatchingResourcePatternResolver(); -
private
final
List<TypeFilter> includeFilters =
new
LinkedList<TypeFilter>(); -
private
final
List<TypeFilter> excludeFilters =
new
LinkedList<TypeFilter>(); -
private
MetadataReaderFactory metadataReaderFactory =
new
CachingMetadataReaderFactory( -
this
.
resourcePatternResolver
); -
public
ClassScaner() { - }
-
public
void
setResourceLoader(ResourceLoader resourceLoader) { -
this
.
resourcePatternResolver
= ResourcePatternUtils - .getResourcePatternResolver(resourceLoader);
-
this
.metadataReaderFactory =
new
CachingMetadataReaderFactory( - resourceLoader);
- }
-
public
final
ResourceLoader getResourceLoader() { -
return
this
.
resourcePatternResolver
; - }
-
public
void
addIncludeFilter(TypeFilter includeFilter) { -
this
.includeFilters.add(includeFilter); - }
-
public
void
addExcludeFilter(TypeFilter excludeFilter) { -
this
.excludeFilters.add(
0
, excludeFilter); - }
-
public
void
resetFilters(
boolean
useDefaultFilters) { -
this
.includeFilters.clear(); -
this
.excludeFilters.clear(); - }
-
public
static
Set<Class> scan(String basePackage, -
Class<?
extends
Annotation>… annotations) { -
ClassScaner cs =
new
ClassScaner(); -
for
(Class anno : annotations) -
cs.addIncludeFilter(
new
AnnotationTypeFilter(anno)); -
return
cs.doScan(basePackage); - }
-
public
static
Set<Class> scan(String[] basePackages, -
Class<?
extends
Annotation>… annotations) { -
ClassScaner cs =
new
ClassScaner(); -
for
(Class anno : annotations) -
cs.addIncludeFilter(
new
AnnotationTypeFilter(anno)); -
Set<Class> classes =
new
HashSet<Class>(); -
for
(String s : basePackages) - classes.addAll(cs.doScan(s));
-
return
classes; - }
-
public
Set<Class> doScan(String basePackage) { -
Set<Class> classes =
new
HashSet<Class>(); -
try
{ -
String packageSearchPath =
ResourcePatternResolver
.CLASSPATH_ALL_URL_PREFIX - + org.springframework.util.ClassUtils
- .convertClassNameToResourcePath(SystemPropertyUtils
- .resolvePlaceholders(basePackage))
-
+
“/**/*.class”
; -
Resource[] resources =
this
.
resourcePatternResolver
- .getResources(packageSearchPath);
-
for
(
int
i =
0
; i < resources.length; i++) { - Resource resource = resources[i];
-
if
(resource.isReadable()) { -
MetadataReader metadataReader =
this
.metadataReaderFactory - .getMetadataReader(resource);
-
if
((includeFilters.size() ==
0
&& excludeFilters.size() ==
0
) - || matches(metadataReader)) {
-
try
{ - classes.add(Class.forName(metadataReader
- .getClassMetadata().getClassName()));
-
}
catch
(ClassNotFoundException e) { - e.printStackTrace();
- }
- }
- }
- }
-
}
catch
(IOException ex) { -
throw
new
BeanDefinitionStoreException( -
“I/O failure during classpath scanning”
, ex); - }
-
return
classes; - }
-
protected
boolean
matches(MetadataReader metadataReader)
throws
IOException { -
for
(TypeFilter tf :
this
.excludeFilters) { -
if
(tf.match(metadataReader,
this
.metadataReaderFactory)) { -
return
false
; - }
- }
-
for
(TypeFilter tf :
this
.includeFilters) { -
if
(tf.match(metadataReader,
this
.metadataReaderFactory)) { -
return
true
; - }
- }
-
return
false
; - }
- }