添加@Component註解掃描到Spring容器中
@Component 是將所有類都添加到容器中
@Service @Controller @Repository是將指定功能的類進行掃描
1.在Appconfig 中的@ComponentScan 註解是將所有 註解過的類掃描至容器中
這個註解後面可以跟幾個值用來指明掃描的範圍以及要過濾的註解等
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 {};
}
includeFilters裏的Filter註解
@ComponentScan(value="com.atguigu",includeFilters = {
/* @Filter(type=FilterType.ANNOTATION,classes={Controller.class}),
@Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class}),*/
@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
},useDefaultFilters = false)
@Filter
excludeFilters = Filter[] :指定掃描的時候按照什麼規則排除那些組件
includeFilters = Filter[] :指定掃描的時候只需要包含哪些組件
FilterType.ANNOTATION:按照註解
FilterType.ASSIGNABLE_TYPE:按照給定的類型;
FilterType.ASPECTJ:使用ASPECTJ表達式
FilterType.REGEX:使用正則指定
FilterType.CUSTOM:使用自定義規則
CUSTOM規則重寫TypeFilter方法利用metadataReader metadataReaderFactory 來實現對bean的過濾
/**
* metadataReader:讀取到的當前正在掃描的類的信息
* metadataReaderFactory:可以獲取到其他任何類信息的
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)