首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring - @CompentScan全解

Spring - @CompentScan全解

作者头像
小小工匠
发布2021-08-17 17:00:54
发布2021-08-17 17:00:54
4580
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构


基本使用

在配置类上写@CompentScan注解来进行包扫描

代码语言:javascript
复制
@Configuration
@ComponentScan(basePackages = {"com.artisan"})
public class MainConfig {

}

excludeFilters

代码语言:javascript
复制
@Configuration
@ComponentScan(basePackages = {"com.artisan"},excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class}),
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {ArtisanService.class})
})
public class MainConfig {
}

这里会 排除标注了@Controller注解 和 特定的ArtisanService ,不会被加载到IOC容器中。


includeFilters

若使用包含的用法, 需要把useDefaultFilters属性设置为false(true表示扫描全部的)

代码语言:javascript
复制
@Configuration
@ComponentScan(basePackages = {"com.artisan"},includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class, Service.class})
},useDefaultFilters = false)
public class MainConfig {
}


@ComponentScan.Filter

4种类型


自定义FilterType

代码语言:javascript
复制
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 ArtisanFilterType implements TypeFilter {

    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //获取当前类的注解源信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();

        //获取当前类的class的源信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //获取当前类的资源信息
        Resource resource =  metadataReader.getResource();
        System.out.println("类的路径:"+classMetadata.getClassName());
        if(classMetadata.getClassName().contains("dao")) {
            return true;
        }
        return false;
    }
}

引用自定义类型的Filter

代码语言:javascript
复制
@ComponentScan(basePackages = {"com.tuling.testcompentscan"},excludeFilters = { 
        @ComponentScan.Filter(type = FilterType.CUSTOM,value = ArtisanFilterType.class)
},includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,value = Repository.class)
})

测试的话,打印下beanDefinition 即可

代码语言:javascript
复制
public class MainClass {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);
        String[] beanDefinationNames = ctx.getBeanDefinitionNames();
        for (String name:beanDefinationNames) {
            System.out.println("bean的定义信息:"+name);
        }

    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本使用
    • excludeFilters
    • includeFilters
  • @ComponentScan.Filter
    • 4种类型
    • 自定义FilterType
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档