Spring的@ComponentScan注解用法介绍

 更新时间:2023年11月24日 10:02:02   作者:IT技术分享社区  
这篇文章主要介绍了Spring的@ComponentScan注解用法介绍,@ComponentScan注解一般和@Configuration注解一起使用,主要的作用就是定义包扫描的规则,然后根据定义的规则找出哪些需类需要自动装配到spring的bean容器中,然后交由spring进行统一管理,需要的朋友可以参考下

1、@ComponentScan注解的作用

@ComponentScan注解一般和@Configuration注解一起使用,主要的作用就是定义包扫描的规则,然后根据定义的规则找出哪些需类需要自动装配到spring的bean容器中,然后交由spring进行统一管理。

说明:针对标注了@Controller、@Service、@Repository、@Component 的类都可以别spring扫描到。

2、@ComponentScan注解属性介绍

1 value

指定要扫描的包路径

2 excludeFilters(排除规则)

excludeFilters=Filter[] 指定包扫描的时候根据规则指定要排除的组件

3 includeFilters(包含规则)

includeFilters =Filter[] 指定包扫描的时候根据规则指定要包含的组件.

注意:要设置useDefaultFilters = false(系统默认为true,需要手动设置) includeFilters包含过滤规则才会生效。

4 FilterType属性

  • FilterType.ANNOTATION:按照注解过滤
  • FilterType.ASSIGNABLE_TYPE:按照给定的类型,指定具体的类,子类也会被扫描到
  • FilterType.ASPECTJ:使用ASPECTJ表达式
  • FilterType.REGEX:正则
  • FilterType.CUSTOM:自定义规则

useDefaultFilters: 配置是否开启可以对加@Component,@Repository,@Service,@Controller注解的类进行检测, 针对Java8 语法可以指定多个@ComponentScan,Java8以下可以用 @ComponentScans() 配置多个规则

3、示例

1 各种过滤过滤规则示例

// includeFilters 用法 包含Animal.class类可以被扫描到,包括其子类
@ComponentScan(value = "com.spring"
  includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {Animal.class}
)}
)
// excludeFilters 用法 排除包含@Controller注解的类
@ComponentScan(value = "com.spring"
        , excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION
                , classes = {Controller.class}
        ),
})
// ComponentScans用法
@ComponentScans(
        value = {
                @ComponentScan(value = "com.spring"
                        , includeFilters = {
                        @ComponentScan.Filter(type = FilterType.ANNOTATION
                                , classes = {Controller.class}
                        )
                }, useDefaultFilters = false) ,
                @ComponentScan(value = "com.spring"
                        , excludeFilters = {
                        @ComponentScan.Filter(type = FilterType.ANNOTATION
                                , classes = { Repository.class}
                        )
                })
        }
)*/
// @ComponentScan 
// 针对Java8 语法可以指定多个@ComponentScan,Java8以下可以用 //@ComponentScans() 配置多个规则
@ComponentScan(value = "com.spring"
        , excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION
                , classes = {Controller.class, Controller.class}
        ),
}, includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION
                , classes = {Controller.class, Controller.class}
        ),
})

2 自定义过滤规则 需要新建 TestTypeFilter.java

package com.spring.config;
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;
/**
 * metadataReader 读取到当前正在扫描的类信息
 * metadataReaderFactory 可以获取到其他任何类的信息
 */
public class TestTypeFilter implements TypeFilter {
    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();
        System.out.println("类名:" + className);
        if (className.contains("controller")) {
            return true;
        } else {
            return false;
        }
    }
}

3 新建测试类  TestComponentScan.java

package com.spring.test;
import com.spring.config.TestComponentScanConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestComponentScan {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(TestComponentScanConfig.class);
        String[] names = annotationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

具体的运行效果可以查看控制台输出结果,是否和预期的一样,具体有不清楚的欢迎沟通交流。

到此这篇关于Spring的@ComponentScan注解用法介绍的文章就介绍到这了,更多相关@ComponentScan注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot + mybatis + druid + 多数据源的问题详解

    springboot + mybatis + druid + 多数据源的问题详解

    这篇文章主要介绍了springboot + mybatis + druid + 多数据源的问题详解,示例代码文字相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java验证码图片生成代码

    Java验证码图片生成代码

    这篇文章主要为大家详细介绍了Java验证码图片生成代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 使用SpringBoot内置web服务器

    使用SpringBoot内置web服务器

    这篇文章主要介绍了使用SpringBoot内置web服务器操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring与Shiro整合及加载权限表达式问题

    Spring与Shiro整合及加载权限表达式问题

    这篇文章主要介绍了Spring与Shiro整合及加载权限表达式问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • idea显示properties文件中文乱码的解决方法

    idea显示properties文件中文乱码的解决方法

    在项目中通常会遇到如下问题,突然properties文件中文乱码,本文主要介绍了idea显示properties文件中文乱码的解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 深入理解java虚拟机的故障处理工具

    深入理解java虚拟机的故障处理工具

    大家都知道在给系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。Java开发人员可以在jdk安装的bin目录下找到除了java,javac以外的其他命令。这些命令主要是一些用于监视虚拟机和故障处理的工具,下面来看看详细的介绍。
    2016-11-11
  • Java后台接收数据的三种方式(url、form-data与application/json)

    Java后台接收数据的三种方式(url、form-data与application/json)

    本文主要介绍了Java后台接收数据的三种方式(url、form-data与application/json),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • java基础之接口组成更新的实现

    java基础之接口组成更新的实现

    本文主要介绍了java基础之接口组成更新的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • IDEA集成Sonar的完整流程

    IDEA集成Sonar的完整流程

    这篇文章主要介绍了IDEA集成Sonar的完整流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 一文带你初识java中的String类

    一文带你初识java中的String类

    String代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现,这篇文章主要给大家介绍了关于java中String类的相关资料,需要的朋友可以参考下
    2021-10-10

最新评论