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)}
    )
  • 相关阅读:
    如何在SQLite中创建自增字段?
    Windows XP平台下编译boost[1.47及以上]
    智能指针的向下转型
    采用Boost::filesystem操作文件
    CodeSmith访问数据库
    std::string的一些操作
    PDF加入内嵌字体
    悟空和唐僧的对话
    收获和教训的一天配置ds1401
    vxworks的一个changlog
  • 原文地址:https://www.cnblogs.com/mayang2465/p/11985144.html
Copyright © 2011-2022 走看看