Spring源码-实现自定义注解

实现自定义的TypeFilter如下,实现match方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component
public class MyTypeFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
AnnotationMetadata annotationMetadate = metadataReader.getAnnotationMetadata();
//获取当前正在扫描的类的信息
ClassMetadata classMethod = metadataReader.getClassMetadata();
//获取当前类资源
Resource resource = metadataReader.getResource();
String className = classMethod.getClassName();
if(annotationMetadate.getClassName().equals("com.ericliu.spring.scaner.LiuHaoMyAnnotionTest")){
return true;
}
return false;
}
}

在容器启动的类上或者configur类上添加如下注解

1
2
3
@ComponentScan(value = "com.ericliu.spring.**", includeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})
}, useDefaultFilters = true)//这里要写true否则,component等注解都无法使用

容器启动后如果设置了basePackage,在doscan时候回调用isCandidateComponent方法,会调用上面的match的方法如果true会将对应的class生成BeanDefiniton,在注入到容器中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException {
for (TypeFilter tf : this.excludeFilters) {
if (tf.match(metadataReader, getMetadataReaderFactory())) {
return false;
}
}
for (TypeFilter tf : this.includeFilters) {
//typteFilter.match返回true
if (tf.match(metadataReader, getMetadataReaderFactory())) {
//判断condintional是否符合条件,注意里面实现的方法名是shouldSkip这里没有注解或者符合条件返回false
return isConditionMatch(metadataReader);
}
}
return false;
}