包注解扫描
@ComponentScan 注解用于替代在配置文件内<context:component-scan base-package=""标签的作用并且注解ComponentScan是和标签一致的,也包含标签的全部属性配置
ComponentScan 注解源码
ComponentScan 注解支持重复注解可以在一个类上使用多个ComponentScan注解前提是JDK1.8
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")//扫描指定的包
String[] basePackages() default {};
//包下的指定的class对象
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;//注解
//过滤的class对象
@AliasFor("classes")
Class<?>[] value() default {};
@AliasFor("value")
Class<?>[] classes() default {};
//过滤的格式
String[] pattern() default {};
}
}
配置类
@Configuration //告诉Spring此类为配置类
@ComponentScan(value = "com.itguigu",useDefaultFilters = false,excludeFilters = {
//不扫描包含的注解
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
})
public class MyConfiguration {
@Bean("person")//bean注解就是相当于在配置文件内的bean标签一样 默认情况下 方法的名字为bean的名称
public Person person1(){
return new Person("GuoQi","1234");
}
}
测试类
@Test
public void test1(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();//获取容器内的存在的名称
for (String name: beanDefinitionNames
) {
System.out.println(name);
}
}
不包含的情况下