Spring深入理解之ComponentScan___@ComponentScan 详解

Spring深入理解之ComponentScan

一、概述

ComponentScan顾名思义包扫描,底层其实就可以通过递归算法+反射将其装载成bean来实现的,实在开发过程中,Spring已经帮我们实现好了,我们其实就可以直接使用XML或者注解的形式来进行业务处理。

二、@ComponentScan的作用

@ComponentScan注解有两个作用

作用一:扫描含有@Component,@Controller,@Service和@Repository的类,并将其注入到spring容器中。

作用二:扫描含有@Configuration的类,并使其生效。

分析:作用一相信大家都明白其含义,再次不在赘述。作用二举例说明,例如Config2可以扫描到config2_test目录,该目录下不仅含有@Component,@Controller,@Service和@Repository注解标注的四个类,还包含Config1配置类。Config1配置类,可以扫描到config1_test目录,并且里面还包含一个@Bean注解。

三、同一个配置类上多个@ComponentScan可能会报错

下面的配置类在我公司电脑的idea版本里是可以将config3_test目录下的所有类都注册到spring容器中,但是在我家里的电脑上以及另一个同事的电脑上会报编译期错误,代码运行也会出错。

四、@ComponentScans的使用

由于同一个类上直接写多个@ComponentScan可能会报错,因此建议使用@ComponentScans,它可以解决直接在一个配置类上写多个@ComponentScan在有些电脑或idea版本上报错的问题。




@ComponentScan 详解

@ComponentScan 的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring容器中,注解定义如下。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {@AliasFor("basePackages")String[] value() default {};@AliasFor("value")String[] basePackages() default {};Class<?>[] basePackageClasses() default {};Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;String resourcePattern() default "**/*.class";boolean useDefaultFilters() default true;ComponentScan.Filter[] includeFilters() default {};ComponentScan.Filter[] excludeFilters() default {};boolean lazyInit() default false;@Retention(RetentionPolicy.RUNTIME)@Target({})public @interface Filter {FilterType type() default FilterType.ANNOTATION;@AliasFor("classes")Class<?>[] value() default {};@AliasFor("value")Class<?>[] classes() default {};String[] pattern() default {};}
}

basePackages与value: 用于指定包的路径,进行扫描

basePackageClasses: 用于指定某个类的包的路径进行扫描

nameGenerator: bean的名称的生成器

useDefaultFilters: 是否开启对@Component,@Repository,@Service,@Controller的类进行检测

includeFilters: 包含的过滤条件

  • FilterType.ANNOTATION:按照注解过滤
  • FilterType.ASSIGNABLE_TYPE:按照给定的类型
  • FilterType.ASPECTJ:使用ASPECTJ表达式
  • FilterType.REGEX:正则
  • FilterType.CUSTOM:自定义规则

excludeFilters: 排除的过滤条件,用法和includeFilters一样

我的工程结构如下,测试对controller和service的扫描,其中HelloController没有加@Controller等任何注解,就是一个普通类。
在这里插入图片描述

修改配置类如下:应用默认的过滤器,扫描service包:

@Configuration
@ComponentScan(value = "com.xhx.spring.service",useDefaultFilters = true
)
public class MyConfig {
}

系统注入了两个service进去
在这里插入图片描述

改成如下所示:HelloController所在的包的类也被扫描了进去

@Configuration
@ComponentScan(value = "com.xhx.spring.service",useDefaultFilters = true,basePackageClasses = HelloController.class
)
public class MyConfig {
}

系统中会注入下面就给类

在这里插入图片描述

把默认的过滤器关掉,扫描带Controller注解的。

@Configuration
@ComponentScan(value = "com.xhx.spring",useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})}
)
public class MyConfig {
}

在这里插入图片描述

按照类的类型扫描,虽然HelloController没有加注解,但是被注入到了spring容器中

@Configuration
@ComponentScan(value = "com.xhx.spring",useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {HelloController.class})}
)
public class MyConfig {
}

在这里插入图片描述

自定义扫描过滤器

package com.xhx.spring.componentscan.config;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 {@Overridepublic boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {String className = metadataReader.getClassMetadata().getClassName();if(className.contains("Controller")){return true;}return false;}
}

修改配置类

@Configuration
@ComponentScan(value = "com.xhx.spring",useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})}
)
public class MyConfig {
}

输出结果:
在这里插入图片描述

输出spring容器中的bean的测试类:只过滤输出了名字中含有hello的类。

package com.xhx.spring.componentscan;import com.xhx.spring.componentscan.config.MyConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;@RunWith(SpringRunner.class)
@SpringBootTest
public class ComponentScanApplicationTests {@Testpublic void testLoads() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);List<String> hello = Arrays.stream(context.getBeanDefinitionNames()).collect(Collectors.toList());hello.stream().filter(name->name.contains("hello")).peek(System.out::println).count();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云服务器centos怎么还原系统还原,云服务器centos怎么还原系统还原

云服务器centos怎么还原系统还原 内容精选换一换云耀云服务器(Halo Elastic Cloud Server&#xff0c;HECS)是可以快速搭建简单应用的新一代云服务器&#xff0c;具备独立、完整的操作系统和网络功能。提供快速地应用部署和简易的管理能力&#xff0c;适用于网站搭建、开发环境…

高倍数泡沫装置PHP_泡沫灭火系统,了解这几点就好

1 集输站库泡沫灭火系统的构成油区的泡沫灭火系统主要由消防水泵、消防水源、泡沫灭火剂储存装置、泡沫比例混合装置、泡沫产生装置及管道等组成。泡沫液按发泡倍数不同可分为低倍数泡沫液、中倍数泡沫液和高倍数泡沫液。发泡倍数 20 以下的称为低倍数泡沫液&#xff0c; 发泡倍…

python自动化_Python 实现Excel自动化办公上

今天的文章分享Python 如何轻松操作Excel 这款office 办公软件的&#xff0c;在Python 中你要针对某个对象进行操作&#xff0c;是需要安装与其对应的第三方库的&#xff0c;这里对于Excel 也不例外&#xff0c;它也有对应的第三方库&#xff0c;即xlrd 库。什么是xlrd库Python…

utf8编码为什么这么普遍,优势在哪里?

为什么需要字符集 计算机存储的和认识的东西就是0和1&#xff0c;我们存储的任何东西最后都会转为0和1的组合计算机才能处理&#xff0c;更贴切的说是我们看到的英文、中文等都是0和1组合的二进制经过一定规则转换为我们认识的字符&#xff0c;这个规则就是字符集。 有哪些字…

SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解

SpringBoot默认包扫描机制及ComponentScan指定扫描路径详解 SpringBoot默认包扫描机制 标注了Component和Component的衍生注解如Controller,Service,Repository就可以把当前的Bean加入到IOC容器中。那么SpringBoot是如何知道要去扫描Component注解的呢。ComponentScan做的事情…

raid卡组不同raid_RAID 类型介绍

RAID (Redundant Array of Independent/InexpensiveDisks)&#xff0c;独立磁盘冗余阵列&#xff0c;是一种将多块独立的硬盘(物理硬盘)按不同的组合方式形成一个硬盘组(逻辑硬盘)&#xff0c;从而提供比单块硬盘更大的存储容量、更高的可靠性和 更快的读写性能等。该概念最早由…

springboot前端传参date类型后台处理方式

springboot前端传参date类型后台处理方式 先说结论&#xff1a;建议大家直接使用JsonFormat&#xff0c;原因如下&#xff1a; 1、针对json格式&#xff1a;在配置文件中加以下配置 spring.jackson.date-formatyyyy-MM-dd HH:mm:ssspring.jackson.time-zoneGMT82、针对form表…

SpringBoot:解决日期转换问题和日期展示问题

本次我们解决问题&#xff1a;日期展示问题(返回的json中日期的格式是:“birthday”:“1988-08-07T15:00:00.0000000”);需要转化成指定的格式&#xff08;年月日时分秒格式&#xff09; 1、问题如 2、解决方案 在配置中加入 #时间戳统一转换 spring.jackson.date-formatyyy…

日期格式化时注解@DateTimeFormat无效的问题分析

日期格式化时注解DateTimeFormat无效的问题分析 背景 有时候我们在写接口时&#xff0c;需要把前台传来的日期String类型转为Date类型 这时我们可能会用到DateTimeFormat注解 在请求数据为非JSON格式时&#xff0c;这个注解是没有问题的&#xff0c;可用的&#xff1b; 但…

12 - java 类加载内存图

栈是线程私有的、堆是线程公有的如果不加 static 就是堆里面的属性&#xff0c;加了static 就是元数据区的属性

source code怎么用_code-builder代码生成器

背景本来code-builder是专门为MyBatis Enhance来编写的一块代码生成器code-builder可以用来做什么&#xff1f;code-builder是一款代码生成maven mojo插件&#xff0c;通过简单的配置就可以完成数据库内Table转换Entity或者其他实体类&#xff0c;想怎么生成完全根据你的个人业…

@Transactional注解的失效场景

Transactional注解的失效场景 引言 Transactional 注解相信大家并不陌生&#xff0c;平时开发中很常用的一个注解&#xff0c;它能保证方法内多个数据库操作要么同时成功、要么同时失败。使用Transactional注解时需要注意许多的细节&#xff0c;不然你会发现Transactional总是…

Spring 事务方法与非事务方法相互调用 @Transactional 注解失效不回滚?

写这篇文章的初衷呢就是最近遇到了一个Spring事务的大坑。与其说是坑&#xff0c;还不如说是自己事务这块儿太薄弱导致的&#xff08;自嘲下&#xff09;。 项目环境 Spring Boot 下面开始问题描述&#xff0c;发生的过程有点长&#xff0c;想直接看方案的直接跳过哦~&#x…

vue后端必须接口吗_前后端分离模式,后端说开发完才能给接口文档,合理吗

背景&#xff1a;汇总了下老王在其他平台的原创回复&#xff0c;欢迎关注老王原创公众号【软件老王】&#xff0c;关注不迷路。一、后端开发完接口才给出接口文档&#xff0c;合理吗&#xff1f;本人所在的项目组做项目过程中&#xff0c;后端不会先给出接口文档&#xff0c;而…

JAVA那点破事,并发、IO模型、集合、线程池、死锁、非阻塞、AQS...

JDK、JRE、JVM 三者有什么关系&#xff1f; 答案&#xff1a; JDK&#xff08;全称 Java Development Kit&#xff09;&#xff0c;Java开发工具包&#xff0c;能独立创建、编译、运行程序。 JDK JRE java开发工具&#xff08;javac.exe/java.exe/jar.exe) JRE&#xff08;…

PTA 最小生成树-kruskal

7-92 最小生成树-kruskal 分数 10 全屏浏览题目 作者 任唯 单位 河北农业大学 题目给出一个无向连通图&#xff0c;要求求出其最小生成树的权值。 温馨提示&#xff1a;本题请使用kruskal最小生成树算法。 输入格式: 输出格式: 输出一个整数表示最小生成树的各边的长度之和。…

java实现单链表

链表是java数据结构中一种很基础很常见却也很重要的数据结构&#xff0c;JDK中许多内置jar包基于单链表实现&#xff0c;比如像我们熟悉的linkedList等&#xff0c;为什么要使用链表呢&#xff1f; 我们知道java中很多集合的底层是基于数组实现的&#xff0c;数组有一个很重要…

sql 两表数据合并_多表查询SQL语句

本篇文章中主要讲述以下内容&#xff1a;一、表的加法合并两张表的过程&#xff1a;然后运用sql语句&#xff1a;select 课程号,课程名称 from course union select 课程号,课程名称 from course1以上子句会把两个表中重复数据删除。要想不删除重复的行&#xff0c;则需要在上面…

angularjs增删改查数据_MongoDB数据读写操作(增删改查)总结

《大数据和人工智能交流》头条号向广大初学者新增C 、Java 、Python 、Scala、javascript 等目前流行的计算机、大数据编程语言&#xff0c;希望大家以后关注本头条号更多的内容。一、在执行mongo.exe文件后&#xff0c;进入MongoDB的shell 操作1、创建一个数据库use users2、查…

SpringAop与AspectJ的联系与区别____比较分析 Spring AOP 和 AspectJ 之间的差别

SpringAop与AspectJ的联系与区别 区别 AspectJ AspectJ是一个面向切面的框架&#xff0c;它扩展了Java语言。AspectJ定义了AOP语法&#xff0c;所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。 spring aop Spring提供了四种类型的Aop支持 * 基于经典的…