springboot 配置文件其它补充【转】【补】

 

TypeFilter组件扫描类过滤器

MyTypeFilter.java

可以对扫描的类做过滤处理,将扫描到的类替摘除或追加到spring窗口中

package com.bobo.code.filter;

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 {

    /**
     *
     * MetadataReader 读取到当前正在扫描类的信息
     * MetadataReaderFactory 可以获取到其他任何类信息
     *
     * @param metadataReader
     * @param metadataReaderFactory
     * @return
     * @throws IOException
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        System.out.println("当前正在被扫描的类的类名: " + classMetadata.getClassName());
        if (classMetadata.getClassName().contains("Service")){
            //AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
            //for (String s : annotationMetadata.getAnnotationTypes()) {
            //    System.out.println("当前正在被扫描的类注解类型: " + s);
            //}

            //Resource resource = metadataReader.getResource();
            //System.out.println("当前正在被扫描的类存放的地址: " + resource.getURL());
            System.out.println("匹配到的类名: " + classMetadata.getClassName());
            return true;
        }else{
            return false;
        }
    }

}

 

FilterType类型

public enum FilterType {
    ANNOTATION,//按照注解方式
    ASSIGNABLE_TYPE,//按照指定类型的方式
    ASPECTJ,//使用ASPECTJ表达式的方式-------没用过,不演示
    REGEX,//利用正则表达式进行指定-----------没用过,不演示
    CUSTOM//自己实现TypeFilter接口进行自定义规则(如下面的代码)
}

 

 

定义和使用

@ComponentScan(value = "com.sisi.code", useDefaultFilters = false, includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, classes = MyTypeFilter.class) })//includeFilters中useDefaultFilters 必须等于 false
@ComponentScan(value = "com.sisi.code", useDefaultFilters = true,  excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, classes = MyTypeFilter.class) })//excludeFilters时useDefaultFilters 必须等于 true(默认本来就为true)
public class MyConfiguration {

}

 

 

规则

includeFilters的match为结果true时,则被扫描到的组件最终会包含到sping的bean组件中 , includeFilters中useDefaultFilters 必须等于 false
excludeFilters的match结果为true时,则被扫描到的组件最终不会含到sping的bean组件中
如果includeFilters和excludeFilters都被命中,且都返回了true,则以includeFilters为更高优先级,即只要被包含一次就不会被剔除.
且TypeFilter的匹配规则永远只触发一次, 会被同时应用到includeFilters和excludeFilters中

 

 

 

 

 

 

 

 

 

 

 

 

.

posted @ 2021-02-26 18:52  苦涩泪滴  阅读(97)  评论(0编辑  收藏  举报