主页提供本章完整代码下载,供大家学习!
组件扫描器
@ComponentScan有如下属性:
value:指定要扫描的package;
includeFilters=Filter[]:指定只包含的组件
excludeFilters=Filter[]:指定需要排除的组件;
useDefaultFilters=true/false:指定是否需要使用Spring默认的扫描规则:被@Component, @Repository, @Service, @Controller或者已经声明过@Component自定义注解标记的组件;
在过滤规则Filter中:
FilterType:指定过滤规则,支持的过滤规则有
ANNOTATION:按照注解规则,过滤被指定注解标记的类;
ASSIGNABLE_TYPE:按照给定的类型;
ASPECTJ:按照ASPECTJ表达式;
REGEX:按照正则表达式
CUSTOM:自定义规则;
value:指定在该规则下过滤的表达式;
根据注解类型过滤–annotation
@Configuration //声明该类是spring核心配置类
@ComponentScan(value = "com.it", // 开启注解格式 扫描com.it包下所有的注解
excludeFilters =@ComponentScan.Filter( //excludeFilter:排除过滤策略
type = FilterType.ANNOTATION, //根据注解过滤
classes = Service.class //Service注解类型
) )
public class SpringConfig {
}
根据自定义类型过滤–custom
- 自定义一个过滤器(简单版)
public class MyTypeFilter implements TypeFilter { //实现TypeFilter接口
@Override
//加载的类满足要求,匹配成功
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
return false; //true:所有的都过滤 false:所有的都不过滤
}
}
- 自定义一个过滤器(过滤指定的类)
public class MyTypeFilter implements TypeFilter {
@Override
//加载的类满足要求,匹配成功
//metadataReader:读取到的当前正在扫描的类的信息。
//metadataReaderFactory:可以获取到其他任务类的信息
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//通过参数获取加载的类的元数据
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//通过类的元数据获取类的名称
String className = classMetadata.getClassName();
//如果加载的类名满足过滤器要求,返回匹配成功
if(className.equals("com.it.service.impl.UserServiceImpl")){
//返回true表示匹配成功,返回false表示匹配失败。此处仅确认匹配结果,不会确认是排除还是加入,排除/加入由配置项决定,与此处无关
return true;
}
return false;
}
}
- 配置类格式:
@Configuration //声明该类是spring核心配置类
@ComponentScan(value = "com.it", // 开启注解格式 扫描com.it包下所有的注解
excludeFilters =@ComponentScan.Filter( //excludeFilter:排除性过滤策略
type = FilterType.CUSTOM, //设置过滤方式为按照自定义类型进行过滤
classes = MyTypeFilter.class //自定义类型类型
) )