作用:
定义扫描路径,把符合扫描规则的类装配到Spring容器中。
@ComponentScan源码:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
String resourcePattern() default "**/*.class";
boolean useDefaultFilters() default true;
ComponentScan.Filter[] includeFilters() default {};
ComponentScan.Filter[] excludeFilters() default {};
boolean lazyInit() default false;
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface Filter {
FilterType type() default FilterType.ANNOTATION;
@AliasFor("classes")
Class<?>[] value() default {};
@AliasFor("value")
Class<?>[] classes() default {};
String[] pattern() default {};
}
}
- basePackages与value:用于指定包的路径,进行扫描。
- basePackageClasses:用于指定某个类的包的路径进行扫描。
- nameGenerator:bean的名称的生成器。
- useDefaultFilters:是否开启对@Component、@Repository、@Service、@Controller的类进行检测。
- includeFilters:包含的过滤条件。
- FilterType.ANNOTATION:按照注解过滤。
- FilterType.ASSIGNABLE_TYPE:按照给定的类型。
- FilterType.ASPECTJ:使用ASPECTJ表达式。
- FilterType.REGEX:正则。
- FilterType.CUSTOM:自定义规则。
- excludeFilters:排除的过滤条件,用法和includeFilters一样。
代码示例:
@Configuration
@ComponentScan(
value = "com.xxx.xxx.service",
useDefaultFilters = true,
basePackageClasses = HelloWorld.class,
includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class}),
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {HelloController.class}),
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})
}
)
public class Config {
}
public class MyTypeFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
String className = metadataReader.getClassMetadata().getClassName();
if(className.contains("Controller")){
return true;
}
return false;
}
}