示例
/**
* ComponentScan 扫描组件
* value 包扫描的路径
* includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件
* type = FilterType.ANNOTATION 按照注解
* classes = {Service.class} 注解里面的Service
* useDefaultFilters = false 使用自定义扫描范围要改成false
* 只扫描我com.cap2下的带有@Service注解的类
*/
@Configuration
@ComponentScan(value = "com.cap2",excludeFilters = {@ComponentScan.Filter(
type = FilterType.ANNOTATION,classes = {Service.class}
)},useDefaultFilters = false)
public class Cap2MainConfig {
}
参数
@ComponentScan value:指定要扫描的包
excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件
includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件
useDefaultFilters = false 默认是true,扫描所有组件,要改成false
扫描规则如下
FilterType.ANNOTATION:按照注解
FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型
FilterType.ASPECTJ:使用ASPECTJ表达式
FilterType.REGEX:使用正则指定
FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口
自定义规则
配置类
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import java.io.IOException;
@Configuration
public class TypeFilter implements org.springframework.core.type.filter.TypeFilter {
private ClassMetadata classMetadata;
/**
*
* @param metadataReader 读取到当前正在扫描类的信息
* @param metadataReaderFactory 可以获取到其他任何类信息
* @return 类的名称中有Order就添加到IOC容器中
* @throws IOException
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前类注解的信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前正在扫描的类信息
classMetadata = metadataReader.getClassMetadata();
//获取当前类资源(类的路径)
Resource resource = metadataReader.getResource();
String className = classMetadata.getClassName();
System.out.println("----->"+className);
if(className.contains("Order")){//当类包含er字符, 则匹配成功,返回true
return true;
}
return false;
}
}
测试
@Configuration
@ComponentScan(value = "com.cap2",excludeFilters = {@ComponentScan.Filter(
type = FilterType.CUSTOM,classes = {TypeFilter.class}
)},useDefaultFilters = false)
public class Cap2MainConfig {
}
@Test
public void test3() {
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Cap2MainConfig.class);
String[] name = app.getBeanDefinitionNames();
for (String s : name) {
System.out.println(s);
}
}