文章目录

  • 前因
  • 方式一
  • 方式二
  • 方式三
  • 方式四
  • 方式五
  • 方式六
  • 总结

前因

我们都知道component-scan在springmvc或者springboot中可以扫描包路径,但是我们如何使用里面的属性排除不需要扫描的类?

方式一

使用spring的xml配置方式实现,这个是基本功,知道这种方式,那么注解方式就容易理解了

<!-- 定义项目扫描包的路径,并且排除ApplicationContextConfig和WebSpringMVCServletConfig-->
<context:component-scan base-package="com.leo"><context:exclude-filter type="assignable" expression="com.leo.config.ApplicationContextConfig"/><context:exclude-filter type="assignable" expression="com.leo.config.WebSpringMVCServletConfig"/>
</context:component-scan>

里面的type有以下几种类型,用法不一一举例了,大家可以自己尝试。

过滤器类型 描述
annotation 过滤器扫描使用注解标注的那些类,并通过expression指定注解全类名
assignable 过滤器扫描派生于expression属性指定的类
aspectj 过滤器扫描与expression属性所指定的AspectJ表达式所匹配的那些类
custom 使用自定义的org.springframework.core.type.TypeFliter实现类,并通过expression指定全类名
regex 过滤器扫描类的名称与expression属性指定正则表达式所匹配的那些类

方式二

这种是通过@component-scan方式在配置扫描包路径的时候直接不包含要排除的包。举例说明一下如下:
项目的包路径是:com.leo.configcon.leo.controllercon.leo.service
我不需要扫描com.leo.config,那么配置@component-scan的时候就可以使用下面的配置直接不用扫描com.leo.config

@ComponentScan(basePackages = {"con.leo.controller","con.leo.service"})

方式三

其实大部分的情况是我们只有com.leo.config下面的某个类需要排除,那么可以使用FilterType.ASSIGNABLE_TYPE排除。参考如下配置

@ComponentScan(basePackages = {"com.leo"}, excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {ApplicationContextConfig.class, WebSpringMVCServletConfig.class}))

方式四

如果上面的class非常多的话,使用上面的方式就不太合适了,那我们可以使用FilterType.ANNOTATION加自定义注解去实现。参考如下配置

@ComponentScan(basePackages = {"com.leo"}, excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = ScanIgnore.class))

自定义@ScanIgnore实现

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ScanIgnore {}

方式五

也可通过自定义的过滤器去实现。使用FilterType.CUSTOM加上自定义的过滤器

@ComponentScan(basePackages = {"com.leo"}, excludeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, classes = MyTypeFilter.class))

自定义过滤器MyTypeFilter

public class MyTypeFilter implements TypeFilter{/*** 过滤当前类的信息,如果包含的则不需要扫描** @param metadataReader 读取当前正在扫描的信息* @param metadataReaderFactory 可以获取到其他任何类的信息* @return* @throws IOException*/@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();//包含这个包路径的则被拦截if(className.startsWith("com.leo.config")){System.out.println("===============>"+className);return false;}return true;}
}

方式六

通过表达式来实现排除,使用FilterType.REGEX,配合pattern来实现。参考配合如下:

@ComponentScan(basePackages = {"com.leo"}, excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.leo.config.*"))

总结

以上都是通过excludeFilters实现排除不需要类的方式,如果是反向操作,需要添加需要的类,则将上面的关键字替换为includeFilters就好了。如果是配置文件的实现则

<context:exclude-filter></context:exclude-filter>
替换成
<context:include-filter></context:include-filter>

spring的配置文件是基础,后面的无论是springmvc亦或者是springboot都是在这个基础上扩展的,所以打好基础很重要。

如何使用@component-scan排除不需要的类相关推荐

  1. java在容器中导入图片_Java程序员必学技术:@Import直接导入类,在容器@Configuration、@Component中是怎么直接导入类注册到容器的?...

    Java程序员必学技术:@Import直接导入类,在容器@Configuration.@Component中是怎么直接导入类注册到容器的? Spring IoC 容器是一个管理 Bean 的容器,在 ...

  2. 软件框架SpringBoot-实现使用@Component@Data@Configuration@Bean(配置类控制类实体类)等方法实现将配置文件从8080端口显示在网页上

    一.前言 1.该程序代码是使用idea2021.12版本编写的,若使用其他软件请对照好配置: 2.这个程序具体的内容我忘了,只知道使用@Component@ConfigurationPropertie ...

  3. springboot 扫描jar包中bean_详解Spring Boot的Component Scan原理

    本文将帮助您了解Spring中最重要的概念 - 组件扫描.Spring Boot在组件扫描方面做了一些魔术 @ComponentScan 如果你了解组件扫描,你就会理解Spring.Spring是一个 ...

  4. springboot启动时,排除某些自动配置类

    springboot在启动时会读取jar包下的spring.factories文件中的EnableAutoConfiguration为键的数据,自动加载这些类,如下图示例. 但有时候,这些自动配置的类 ...

  5. 注解Annotation的IoC:从@Autowired到@Component

    注解Annotation的IoC:从@Autowired到@Component 2017-01-23 目录 1 什么是注解 2 不使用注解示例   2.1 com.springioc.animal.M ...

  6. 腾讯二面:@Bean与@Component用在同一个类上,会怎么样?

    文章来源:https://sourl.cn/nN9qXE 疑虑背景 | 疑虑描述 最近,在进行开发的过程中,发现之前的一个写法,类似如下: 以我的理解,@Configuration 加 @Bean 会 ...

  7. Spring中的@ Component,@ Repository和@Service批注有什么区别?

    @Repository @Component , @Repository和@Service批注可以在Spring中互换使用吗,或者除了充当注解设备外,它们还提供任何特定功能吗? 换句话说,如果我有一个 ...

  8. component是什么接口_逐行解读Spring(二)什么,自定义标签没听说过?

    一.自定义标签是什么? 上一篇我们讲了默认标签-bean标签的解析,今天我们讲一下自定义标签的解析. 1. 自定义标签的定义 这个问题其实上一篇有讲过,这边再复述一遍,在spring的xml配置文件中 ...

  9. spring注解( @Autowired、@Qualifier、@Resource、@PostConstruct、@PreDestroy、 @Component、@Scope)-描述的比较清楚

    概述: 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 P ...

最新文章

  1. python手动将机器学习模型保存为json文件
  2. python测试代理IP地址
  3. 广东白云机场俯视图,猜猜像什么
  4. 淘宝弹性布局方案lib-flexible实践
  5. 药品研发 计算机系统验证,基于验证的药品研发项目申报系统的设计
  6. C#不区分大小写的字符串替换(Replace)函数
  7. android图片显示代码,Android图片处理:识别图像方向并显示(示例代码)
  8. Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM)
  9. python-day74--知识总体总结
  10. 安装 Silverlight 5/silverlight4 出错的解决方法
  11. asa清空配置_思科ASA基本配置
  12. aviary 图片编辑器
  13. .Net 简单使用 Hangfire
  14. abp .net core linux,Abp vNext框架 从空项目开始 使用ASP.NET Core Web Application-笔记
  15. 商用室内机器人才是未来机器人开发的热点与趋势
  16. 如何让你pycharm用起来更舒服,看起来更美观
  17. Speed Good Free(百度网盘第三方免登下载器)
  18. 1.浮动 float
  19. 阿里云建站-CV小站
  20. Linux文件 IO 和标准 IO简介

热门文章

  1. OO ALV 工具栏对于的功能码
  2. Funtion:POPUP_TO_DECIDE_LIST
  3. ALV列、行、单元格颜色设置
  4. 创建总账科目类型会计凭证
  5. 创建BAPI程序的步骤
  6. 上半年营收超阿迪,相当于2.2个李宁,安踏凭什么?
  7. nestjs配置MySQL数据库,Nest.js 中的数据库操作
  8. python querystring encode_Java UriUtils.encodeQueryParam方法代碼示例
  9. php如何判断多文件上传,php多文件上传
  10. python关键字与标识符