zoukankan      html  css  js  c++  java
  • 包扫描

    看《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)}
    )
  • 相关阅读:
    C 语言中的 fgets()
    C++ 中的 C_str() 函数用法
    Ubuntu 下使用 sshfs 挂载远程目录到本地
    VirtualBox 下主机与虚拟机以及虚拟机之间互通信配置
    转:sudo 的常见用法和参数选项
    “a++” 与 “++a” 的区别
    Linux 下运行 C++ 程序出现 “段错误(核心已转储)”
    vector容器中添加和删除元素
    NCCloud 指令示例
    c++ find函数用法
  • 原文地址:https://www.cnblogs.com/mayang2465/p/11985144.html
Copyright © 2011-2022 走看看