博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【spring 注解】第2篇:@ComponentScan
阅读量:5985 次
发布时间:2019-06-20

本文共 4925 字,大约阅读时间需要 16 分钟。

@ComponentScan

用于指定包的扫描路径。用于代替spring的xml配置文件中的<context:componet-scan base-package=""/>标签。

context:componet-scan标签

context:componet-scan的作用

spring就会去自动扫描base-package对应的路径或者该路径的子包下面的带有@Service,@Component,@Repository,@Controller注解的java文件。

context:componet-scan属性

  1. base-package: 指定扫描路径。
  2. use-default-filters: 是否使用默认的扫描过滤器。
  • use-default-filters=true表示扫描包路径的@Service,@Component,@Repository,@Controller注解的类;如果你不想全部扫描这些类,可以进行过滤,比如说你不想扫描@Controller注解的类。
  • use-default-filters=true表示按照自定义规则扫描包路径下的类;

@ComponentScan的使用

该注解是使用在我们的配置类上的。

/** * 配置类等价于spring的配置文件 */@Configuration@ComponentScan(value = "com.sff.app",        includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)},        useDefaultFilters = false)public class AppConfig {    /*给容器中注册一个bean,类型是方法返回值,id就是方法名称*/    @Bean    public Person person() {        return new Person("Kate", 12);    }}

@ComponentScan的属性说明

@ComponentScan(value = "com.sff.app",useDefaultFilters = false,        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,        classes = {Controller.class, Service.class})})@ComponentScan(value = "com.sff.app",        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,        classes = {Controller.class, Service.class})})
  • useDefaultFilters: 是否使用默认的扫描过滤器,相当于use-default-filters的功能。
  • excludeFilters: 指定扫描时需要按照什么规则排除不扫描的类。
  • includeFilters: 指定扫描时需要按照什么规则扫描的类。

我们看下注解源码是怎么定义的?

@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Documented@Repeatable(ComponentScans.class)public @interface ComponentScan {    /*定义了包扫描路径属性*/    @AliasFor("basePackages")    String[] value() default {};    @AliasFor("value")    String[] basePackages() default {};    /*默认使用默认的过滤,全部扫描*/    boolean useDefaultFilters() default true;    /*过滤器属性,过滤器是一个数组,可以配置多个*/    ComponentScan.Filter[] includeFilters() default {};    ComponentScan.Filter[] excludeFilters() default {};        /*过滤器注解*/    @Retention(RetentionPolicy.RUNTIME)    @Target({})    public @interface Filter {        /*默认的过滤规则是按照注解来过滤*/        FilterType type() default FilterType.ANNOTATION;    }}/*Filter中的FilterType支持过滤类型*/public enum FilterType {    ANNOTATION, //注解    ASSIGNABLE_TYPE, //指定类型,比如指定包路径下的某个具体类    ASPECTJ,//使用aspectj表达式    REGEX,//正则表达式    CUSTOM;//自定义}

@ComponentScan的自定义扫描规则

  • 实现TypeFilter类
/** * 自定义过滤规则 */public class CustomFilterType implements TypeFilter {    /**     * @param metadataReader        获取当前正在扫描的类的信息     * @param metadataReaderFactory 获取其他类的信息     * @return     * @throws IOException     */    @Override    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)            throws IOException {        /*获取当前类的注解信息*/        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();        /*获取当前类的信息*/        ClassMetadata classMetadata = metadataReader.getClassMetadata();        /*获取资源文件*/        Resource resource = metadataReader.getResource();        System.out.println("---------------->" + classMetadata.getClassName());        /*过滤类全名称包括HelloController的类*/          if (classMetadata.getClassName().contains("HelloController")) {            return true;        }        return false;    }}
  • 配置类配置自定义扫描规则
/** * 配置类等价于spring的配置文件 */@Configuration@ComponentScan(value = "com.sff.app",useDefaultFilters = false,        includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, classes = CustomFilterType.class)})public class AppConfig {    /*给容器中注册一个bean,类型是方法返回值,id就是方法名称*/    @Bean    public Person person() {        return new Person("Kate", 12);    }}
  • 测试类
public class ComponentScanTest {    public static void main(String[] args) {        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);        String[] names = ctx.getBeanDefinitionNames();        for (String name : names) {            System.out.println(name);        }    }}

结果分析:

//打印出了当前扫描的类的信息---------------->com.sff.app.ComponentScanTest---------------->com.sff.app.ConfigurationTest---------------->com.sff.app.TestAnno---------------->com.sff.app.anno.AnnoDemo---------------->com.sff.app.anno.MyAnnotation---------------->com.sff.app.anno.Rename---------------->com.sff.app.bean.Person---------------->com.sff.app.config.CustomFilterType---------------->com.sff.app.controller.HelloController---------------->com.sff.app.service.HelloServiceorg.springframework.context.annotation.internalConfigurationAnnotationProcessororg.springframework.context.annotation.internalAutowiredAnnotationProcessororg.springframework.context.annotation.internalRequiredAnnotationProcessororg.springframework.context.annotation.internalCommonAnnotationProcessororg.springframework.context.event.internalEventListenerProcessororg.springframework.context.event.internalEventListenerFactory/*过滤后容器中的类信息*/appConfig  //主配置类helloController person //通过@Bean注入的

转载地址:http://etylx.baihongyu.com/

你可能感兴趣的文章
目录文件Oracle11g彻底删除
查看>>
删除androidAndroid递归方式删除某文件夹下的所有文件
查看>>
CSS overflow 属性
查看>>
第10次实验任务
查看>>
Sharepoint学习笔记—习题系列--70-573习题解析 -(Q15-Q18)
查看>>
java中的设计模式一 装饰模式
查看>>
作用域及可见性
查看>>
基于Mongodb进行分布式数据存储
查看>>
PL/pgSQL学习笔记之五
查看>>
Android 经验: 5555 端口会被 adb 误认为 emulator
查看>>
Android手机便携式wifi的使用及无线数据传输(主要针对XP系统)
查看>>
MFC控件(8):command button与syslink control
查看>>
c语言结构体用法
查看>>
symfony手动触发修饰html
查看>>
WCF小实例以及三种宿主
查看>>
Java生成唯一GUID
查看>>
RHEL 6.4 安装svn和apache
查看>>
UVa10815 - Andy's First Dictionary
查看>>
graphterm 0.40.1 : Python Package Index
查看>>
poj2447
查看>>