包扫描

看《spring源码解析》笔记

1、使用@ComponentScan,会到对应包中对添加特定注解(@Service,@Constroller,@Repository)的类进行扫描,添加到容器中。

@Configuration

@ComponentScan(value="com.atguigu")
public class MainConfig { }

2、如果想查看容器中扫描出哪些:

@Test
    public void test01(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        String[] definitionNames = applicationContext.getBeanDefinitionNames();
        for (String name : definitionNames) {
            System.out.println(name);
        }
    }

3、使用包扫描的时候,还可以使用过滤规则,查看@ComponentScan的内容,可以发现:

   /*只包含哪些,扫描的时候按照什么规则只需要包含哪些组件*/ 
  ComponentScan.Filter[] includeFilters() default {};
   /*包含哪些,扫描的时候按照什么规则排除那些组件*/ 
  ComponentScan.Filter[] excludeFilters() default {};

  其中includeFilters和excludeFilters都是Filter类的数组:

@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 {};
    }

  说明其中可以根据type进行包含或者屏蔽,type的值有:ANNOTATION,ASSIGNABLE_TYPE,ASPECTJ,REGEX,CUSTOM;

  classes是一个Class数组。

  以下为使用排除或只包含时的例子:

@Configuration
@ComponentScan(value="com.atguigu",includeFilters = {
                        @Filter(type=FilterType.ANNOTATION,classes={Controller.class})})
public class MainConfig {

}

解释:扫描"com.atguigu"包下的类,通过注解进行过滤,只包含:注解是Controller的类

具体实现效果,通过第二步进行查看。

4、在过滤规则中还可以使用:useDefaultFilters = false,可以屏蔽spring默认加载的Bean。

@Configuration
@ComponentScan(value="com.atguigu",includeFilters = {
                        @Filter(type=FilterType.ANNOTATION,classes={Controller.class})},useDefaultFilters = false)
public class MainConfig {

}

5、延伸知识:

  (1)、通过查看ComponentScan,可以发现其是可以重复的,即可以多写几次:

@Repeatable(ComponentScans.class)

  (2)、当有多写几次的需求的时候,可以使用@ComponentScans注解,里面value是一个数组。

@ComponentScans(
value = {@ComponentScan(value="com.atguigu",includeFilters = {
@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
},useDefaultFilters = false) ,
@ComponentScan(value="com.atguigu",includeFilters = {
@Filter(type=FilterType.ANNOTATION,classes={Controller.class})
},useDefaultFilters = false)}
)
原文地址:https://www.cnblogs.com/mayang2465/p/11985144.html