• 包扫描


    看《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)}
    )
  • 相关阅读:
    [LeetCode] Range Sum Query
    [LeetCode] Longest Increasing Subsequence
    [LeetCode] Bulls and Cows
    [LeetCode] Serialize and Deserialize Binary Tree
    [LeetCode] Find Median from Data Stream
    [LeetCode] Convert Sorted List to Binary Search Tree
    [LeetCode] Nim Game
    [LeetCode] Word Pattern
    安装配置说明与注意
    java.lang.OutOfMemoryError: PermGen space及其解决方法
  • 原文地址:https://www.cnblogs.com/mayang2465/p/11985144.html
Copyright © 2020-2023  润新知