欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

@ComponentScan注解

程序员文章站 2022-07-12 11:37:38
...

示例

/**
 * ComponentScan 扫描组件
 * value 包扫描的路径
 * includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件
 * type = FilterType.ANNOTATION 按照注解
 * classes = {Service.class} 注解里面的Service
 * useDefaultFilters = false 使用自定义扫描范围要改成false
 * 只扫描我com.cap2下的带有@Service注解的类
 */

@Configuration
@ComponentScan(value = "com.cap2",excludeFilters = {@ComponentScan.Filter(
        type = FilterType.ANNOTATION,classes = {Service.class}
)},useDefaultFilters = false)
public class Cap2MainConfig {
}

参数

@ComponentScan value:指定要扫描的包
excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件
includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件
useDefaultFilters = false 默认是true,扫描所有组件,要改成false
扫描规则如下
FilterType.ANNOTATION:按照注解
FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型
FilterType.ASPECTJ:使用ASPECTJ表达式
FilterType.REGEX:使用正则指定
FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口

自定义规则

配置类

import org.springframework.context.annotation.Configuration;
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 java.io.IOException;

@Configuration
public class TypeFilter implements org.springframework.core.type.filter.TypeFilter {
    private ClassMetadata classMetadata;
    /**
     *
     * @param metadataReader        读取到当前正在扫描类的信息
     * @param metadataReaderFactory 可以获取到其他任何类信息
     * @return 类的名称中有Order就添加到IOC容器中
     * @throws IOException
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
            //获取当前类注解的信息
            AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
            //获取当前正在扫描的类信息
            classMetadata = metadataReader.getClassMetadata();
            //获取当前类资源(类的路径)
            Resource resource = metadataReader.getResource();

            String className = classMetadata.getClassName();
            System.out.println("----->"+className);
            if(className.contains("Order")){//当类包含er字符, 则匹配成功,返回true
                return true;
            }
            return false;
    }
}

测试

@Configuration
@ComponentScan(value = "com.cap2",excludeFilters = {@ComponentScan.Filter(
        type = FilterType.CUSTOM,classes = {TypeFilter.class}
)},useDefaultFilters = false)
public class Cap2MainConfig {
}

@ComponentScan注解

@Test
    public void test3() {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Cap2MainConfig.class);
        String[] name = app.getBeanDefinitionNames();
        for (String s : name) {
            System.out.println(s);
        }
    }

@ComponentScan注解