扫描组件@ComponentScan可以自动扫描包以内的含有@Service,@Controller,@Repository,@Component的组件到IOC容器里面去

@ComponentScan有几个重要的参数

1.value:填写要扫描的包(会级联扫描内部所有子包)

2.excludeFilters(排除扫描组件的规则)

里面装的是Filter的数组
Filter有2个属性:
①type:type是枚举类,里面有以下几种属性:
ANNOTATION, 注解,
ASSIGNABLE_TYPE, ANNOTATION:指定的类型,按照给定的类型,不管是子类还是实现类
ASPECTJ, 按照Aspectj的表达式,基本上不会用到按照
REGEX, 按照正则表达式
CUSTOM 自定义规则
②value(或者classes): 类类型的数组
按照前面的type定义的规则来找到对应的类进行排除

3.includeFilters,它的属性和excludeFilters是一样的,不同的是,它需要关闭ComponentScan里面的属性(useDefaultFilters = false)

示例代码:

ANNOTATION:

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;import java.util.ArrayList;
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;
@ComponentScan(value = "com.debuggg",excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class}),
},useDefaultFilters = false)

ASSIGNABLE_TYPE:指定的类及其所有子类,实现类扫描

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;import java.util.ArrayList;
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;
@ComponentScan(value = "com.debuggg",excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {UserService.class})
},useDefaultFilters = false)
public class TransferQueueTest {

CUSTOM: 自定义扫描规则

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;import java.util.ArrayList;
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;
@ComponentScan(value = "com.debuggg",excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})
},useDefaultFilters = false)
public class TransferQueueTest {

MyTypeFilter.java

package com.debuggg.test1.main3;import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;import java.io.IOException;public class MyTypeFilter implements TypeFilter {@Overridepublic boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {//获取当前类注解的信息AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();//获取当前正在扫描的类的信息ClassMetadata classMetadata = metadataReader.getClassMetadata();//获取当前类资源(类的路径)Resource resource = metadataReader.getResource();String className = classMetadata.getClassName();System.out.println("----> " + className);//如果扫描到的类里面包含er就加入到ioc容器里面if(className.contains("er")){return true;}return false;}
}

组件注册@ComponentScan的自动扫描和指定扫描规则相关推荐

  1. 组件注册——@ComponentScan自动扫描组件指定扫描规则

    包扫描.只要标注了@Controller.@Service.@Repository,@Component IOCTest.java package com.atguigu.test;import or ...

  2. 02-组件注册-@ComponentScan-自动扫描组件指定扫描规则

    目录 1.配置文件方式:加入context命名空间导入到配置文件 2.主配置类方式:配置类中添加自动扫描组件注解 @ComponentScan 实际在开发中包扫描用的比较多,注解为@Component ...

  3. Spring注解开发系列Ⅰ--- 组件注册(上)

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文 ...

  4. spring注解--组件注册

    组件注册 1.@Configuration , @Bean 1)xml方式 <?xml version="1.0" encoding="UTF-8"?&g ...

  5. SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解

    SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解 SpringBoot默认包扫描机制 标注了@Component和@Component的衍生注解如@Controller ...

  6. SpringBoot默认包扫描机制及使用@ComponentScan指定扫描路径

    SpringBoot默认包扫描机制 标注了@Component和@Component的衍生注解如@Controller,@Service,@Repository就可以把当前的Bean加入到IOC容器中 ...

  7. spring系列-注解驱动原理及源码-bean组件注册

    目录 一.环境初始化 1.环境准备 二.bean的手动注入 1.xml方式注入bean 2.使用@Configuration&@Bean方式注入bean 三.自动扫描注册组件及bean 1.使 ...

  8. Spring注解驱动:组件注册(一)

    文章目录 1.Spring简单环境 2.Spring注解容器 2.1 代码示例 2.2 给容器注册组件4种方式 2.2.1 工厂创建对象 2.3 声明周期 2.3.1 Bean指定初始化和销毁方法 2 ...

  9. 实验16:使用context:include-filter指定扫描包时要包含的类 实验17:使用context:exclude-filter指定扫描包时不包含的类

    实验17:使用context:exclude-filter指定扫描包时不包含的类 扫描的时候可以排除一些不要的组件 type="annotation" 指定排除规则,按照注解进行排 ...

最新文章

  1. nbiot开发需要掌握什么_包装设计需要掌握什么技巧
  2. WP8.1学习系列(第八章)——透视Pivot设计指南
  3. hdu 2064汉诺塔III 递推
  4. 递归和迭代路由_静态路由在以太网接口中的不同书写会导致路由器怎样的操作结果?...
  5. mysql多表联合删除
  6. 使用Server 2008新GPO做驱动器映射
  7. c++怎么实现数字数组的删除数字_C/C++数据结构:栈结构解析,最简单解析,让你一遍就会...
  8. php在线考试系统模板下载,PHPEMS在线模拟考试系统 v6.1
  9. OpenGL ES SDK for Android - 4
  10. 不只是新车,2019上海车展还有这些彩蛋 | 一级供应商、科技公司篇
  11. python cprofile_python 中 cprofile 分析 多进程程序
  12. oracle弱口令攻击
  13. python PPT批量制作封面图及导出视频教程
  14. MySQL8安装详细步骤
  15. rpc调用 java_RPC调用的简单实现
  16. Js 摄氏度和华氏度的转换
  17. 红米手机4X获得Root权限的流程
  18. 小鸡啄米之React事件处理
  19. 消除VMware启动虚拟机时的floppy0提示的方法
  20. Python中以字母r/R,或字母u/U 开头的字符串

热门文章

  1. 2021年量子计算机奖,中兴通讯携手中国移动共获“2021年未来网络领先创新科技成果”奖...
  2. 通过Server 2019中的组策略部署桌面墙纸 详解组策略环回处理
  3. 载 Kubernetes和OpenStack到底是什么关系?先搞清楚,再系列学习
  4. Java基础学习总结(113)——异常最佳实践
  5. Java Web学习总结(34)——拦截器和过滤器的差异总结
  6. Ehcache学习总结(2)--Ehcache整合spring配置
  7. JNDI学习总结(4)——Tomcat下使用Druid配置JNDI数据源
  8. order是mysql系统关键字_MySQL数据库如何使用“ORDER BY”关键字对查询结果进行排序呢?...
  9. unity的inputField文本框赋值问题
  10. Perl内置特殊变量