添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

我们都知道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
    @Override
    public 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都是在这个基础上扩展的,所以打好基础很重要。

指定包扫描的根路径,让 Spring 来扫描指定包及子包下的组件。不过在上面的声明中有显式的指定了两个过滤条件: @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, c... ComponentScan与excludeFilters简介,使用不当会出现A component required a bean of type 'com.xxxx.xxx' that could not be found   在抽取公共swagger配置时,将swagger放入com.test.common.config包内,其他模块通过@ComponentScan进行进行引用,但有的模块在引用时,会扫描到common.config包路径下的其他配置而引发错误,如引用到RedisConfig而报错,此时需要将该排除掉。   通过@ComponentScan中的excludeFilters属性进行排除。 @SpringBootApplication @ComponentScan(basePackage 自定义规则需继承org.springframework.core.type.filter.TypeFilter,实现match方法即可。@Override//可以通过MetadataReader获得各种信息,然后根据自己的需求返回boolean,实例表示包名含有aaa路径的名将满足筛选条件。}}配置结果就是含有aaa路径的名将被排除不被加入spring容器中。... 在 SpringBoot项目中有时候某些需要被 @ComponentScan注解给扫描到, 比如在给某个服务的Ribbon自定义配置时,为得防止 @Configuration注解的所在的包与 @ComponentScan扫描的包重叠. 使用 @ComponeentScan 的 excludeFilters 属性进行设定我们需要排除. @ComponentScan(excludeFilters 2.下面是引用spring framework开发手册中的一段话“ Spring 2.5引入了更多典型化注解(stereotype annotations): @Component、@Service和 @Cont 最近接手一套基于SpringBoot项目,对项目进行重构调整,将公共部分抽离成子项目。在实践的过程中,发现抽离之后的模板中组件并没有被初始化。于是将排查解决过程中搜集到的方案及知识汇总分享给大家。 问题的原因很简单,因多套系统的package命名不一致。比如业务系统的包命名为com.abc.xx,而公共(common)部分的包命名为com.efg.xx,引入公共jar包时默认是无法初始化的。 对于SpringBoot项目,我们知道扫描的路径从启动所在包开始,扫描当前包及其子级包下的所有文件。上 最近在学习SpringCloud的Ribbon,在使用 @RibbonClient(name = "SPRINGCLOUD-P-DEPT", configuration = RibbonConfig.class) 为服务指定负载均衡策略的时候,自定义的Ribbon配置不能被Springboot的**@ComponentScan**注解扫描到,所以需要将自定义的配置Ribbo... @ComponentScan过滤不需要前言一、excludeFilters属性需要传递@ComponentScan.Filter注解二、示例指定排除指定排除注解自定义@ComponentScanIgnore实现过滤器自定义过滤器MyTypeFilter表达式总结 因为maven工程互相依赖,但是不需要依赖子项目的某些切面和配置,这时项目会配置@ComponentScan扫码子工程的包,由于启动的时候已经加载到了容器里面,于是就用上了@ComponentScan的excludeFilter @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX,pattern = "com.action.other.*") public class Application { public static void ma... @ComponentScan注解的排除属性 @ComponentScan组件源码,直截取了用到的属性: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Repeatable(ComponentScans.class) public @interface ComponentScan { // 是否使用默认过滤规则:默认为true,被@Component、@Repository、@Service、@Co <!-- 定义项目扫描包的路径,并且排除ApplicationContextConfig和WebSpringMVCServletConfig--> <context:component-scan base-package="com.l import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.s