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注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java BeanMap实现Bean与Map的相互转换

    Java BeanMap实现Bean与Map的相互转换

    这篇文章主要介绍了利用BeanMap进行对象与Map的相互转换,通过net.sf.cglib.beans.BeanMap类中的方法来转换,效率极高,本文给大家分享实现代码,感兴趣的朋友一起看看吧
    2022-11-11
  • ssm项目实现用户登陆持久化(token)

    ssm项目实现用户登陆持久化(token)

    这篇文章主要介绍了ssm项目实现用户登陆持久化(token),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 详解Java中的ReentrantLock锁

    详解Java中的ReentrantLock锁

    这篇文章主要介绍了Java中ReentrantLock锁的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-01-01
  • Java农夫过河问题的继承与多态实现详解

    Java农夫过河问题的继承与多态实现详解

    这篇文章主要介绍了Java农夫过河问题的继承与多态实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    这篇文章主要介绍了java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java实现图书管理系统的示例代码

    Java实现图书管理系统的示例代码

    这篇文章将通过Java实现一个简答的图书管理系统,本图书管理系统用对象数组的方式来提供操作方法,比较特别,建议新手学习,这对理解Java面向对象有很大帮助
    2022-11-11
  • Java内存区域和内存模型讲解

    Java内存区域和内存模型讲解

    今天小编就为大家分享一篇关于Java内存区域和内存模型讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Spring Boot常用注解(经典干货)

    Spring Boot常用注解(经典干货)

    Spring Boot是一个快速开发框架,快速的将一些常用的第三方依赖整合,全部采用注解形式,内置Http服务器,最终以Java应用程序进行执行,这篇文章主要介绍了Spring Boot常用注解(绝对经典),需要的朋友可以参考下
    2023-01-01
  • Java并发内存模型详情

    Java并发内存模型详情

    这篇文章主要介绍了Java并发内存模型,Java是一门支持多线程执行的语言,要编写正确的并发程序,了解Java内存模型是重要前提。而了解硬件内存模型有助于理解程序的执行,下面文章就来看看详细内容吧
    2021-10-10
  • JavaMe开发自适应滚动显示

    JavaMe开发自适应滚动显示

    我们常看到一些滚动显示的实例,比如UC浏览器中,显示网页的内容。当内容比较多时,采用滚动分页显示是合理的。在Canvas中绘图中,多余的内容被截断了。如何实现滚动分页显示呢?
    2015-09-09

最新评论