@AutoConfigurationPackage 和 @ComponentScan 有何区别?

首先,从名字上看,这两个注解意义特别接近,@AutoConfigurationPackage 就是自动配置包,自动配置包的目的是能让系统扫描到包内的 Bean;@ComponentScan 则是组件扫描,这个松哥在之前的教程中也多次提到过了,就不再赘述了,所以这里就有一个问题,这两个注解有啥区别?

首先大家思考这样一个问题:

现在大多数项目可能都是用的 MyBatis 或者 MyBatis-Plus 这样的数据持久化框架,当我们在 Spring Boot 中使用 MyBatis 的时候,我们一般需要在 Mapper 接口上添加一个 @Mapper 注解,类似下面这样:

@Mapper
public interface UserMapper {
}

或者在启动类上加 Mapper 扫描注解去统一扫描所有的 Mapper 接口,类似下面这样:

@SpringBootApplication
@MapperScan(basePackages = "org.javaboy.auto_package")
public class AutoPackageApplication {public static void main(String[] args) {SpringApplication.run(AutoPackageApplication.class, args);}}

平时我们都这样写,没有任何问题,现在假设我们换一个写法,假如我的类结构如下:

├── main
│   ├── java
│   │   └── org
│   │       └── javaboy
│   │           └── auto_package
│   │               ├── config
│   │               │   ├── AutoPackageApplication.java
│   │               │   └── UserController.java
│   │               ├── mapper
│   │               │   └── UserMapper.java
│   │               └── service
│   │                   └── UserService.java

小伙伴们看到,我把启动类和 UserController 放在一个单独的包中,UserMapper 和 UserService 也分别位于不同的包中,其中在 UserController 中注入了 UserService,在 UserService 中则注入了 UserMapper,大致上就这么一个关系。

按照我们之前对 Spring Boot 的理解,这个项目启动肯定会报错,因为默认情况下,系统扫描的 Bean 是启动类所在的包以及子包下的所有 Bean(因为 @SpringBootApplication 注解在启动类上),所以上面这个项目启动的时候,能扫描到 UserController,但是扫描不到 UserService,所以启动的时候会报错,如下:

大家看下,这意思很明确,UserService 找不到,所以启动失败。

解决这个问题的办法很简单,要么将启动类放到根包下面,这样所有的 Bean 默认就都能扫描到了,要么我们重新配置包扫描,这里我采用第二种方案,我们在启动类上加 @ComponentScan 注解,重新指定扫描的包,如下:

@SpringBootApplication
@ComponentScan(basePackages = "org.javaboy.auto_package")
public class AutoPackageApplication {public static void main(String[] args) {SpringApplication.run(AutoPackageApplication.class, args);}}

加上之后,我们再次启动,发现又报错了,如下:

虽然再次出错,但是跟之前的错误并不一样,这次是没找到 UserMapper 这个 Bean,说明 UserService 是找到了!

从这里我们就可以看出来,@ComponentScan 注解扫描组件是不会扫描到 @Mapper 注解的!

事实上,@ComponentScan 注解主要是扫描 Spring 家族的各种 Bean,如 @Controller、@Service、@Component、@Repository 以及由此衍生出来的一些其他的 Bean,对于 Spring 家族之外的 Bean,如 MyBatis 的 @Mapper、@MapperScan,JPA 的 @Entity 等,@ComponentScan 都扫不到!

谁能扫到呢?那就是我们今天的另外一个主角 @AutoConfigurationPackage,这个注解其实就是专门用来扫这些第三方的各种 Bean 的。

现在,我们在项目启动上加上 @AutoConfigurationPackage 注解,并设置需要扫描的位置,如下:

@SpringBootApplication
@AutoConfigurationPackage(basePackages = "org.javaboy.auto_package")
@ComponentScan(basePackages = "org.javaboy.auto_package")
public class AutoPackageApplication {public static void main(String[] args) {SpringApplication.run(AutoPackageApplication.class, args);}}

此时,项目就可以成功启动了,因为 @AutoConfigurationPackage(basePackages = "org.javaboy.auto_package") 注解可以扫描到 @Mapper 注解。

当然,这里只是为了给大家演示问题,实际场景下直接在启动类上加 @MapperScan(basePackages = "org.javaboy.auto_package") 注解就可以了。因为 @MapperScan 注解是 mybatis-spring 提供的,而 @Mapper 是 MyBatis 自己提供的,两个注解的出处本身就不同。

默认情况下,Spring Boot 项目的启动注解中,实际上已经包含了 @AutoConfigurationPackage 注解,具体位置在 @SpringBootApplication->@EnableAutoConfiguration->@AutoConfigurationPackage,默认该注解没有指定 basePackages 属性,表示使用启动类所在的包作为根包,扫描该包下的所有第三方 Bean,所以我们平时在 Spring Boot 中使用 MyBatis 的时候,是不需要额外加 @AutoConfigurationPackage 注解的。

经过上面问题的演示,相信小伙伴们已经搞明白了 @AutoConfigurationPackage 和 @ComponentScan 的区别了吧?

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

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

相关文章

scratch套娃生产机 2024年3月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch套娃生产机 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、…

Ubuntu 20.04 设置开启 root 远程登录连接

Ubuntu默认不设置 root 帐户和密码 Ubuntu默认不设置 root 帐户和密码 Ubuntu默认不设置 root 帐户和密码 如有需要,可在设置中开启允许 root 用户登录。具体操作步骤如下: 操作步骤 1、首先使用普通用户登录 2、设置root密码 macw:~$ sudo passwd …

qutip,一个高级的 Python 量子力学研究库!

目录 前言 安装 特性 基本功能 量子态的创建和操作 量子态的测量 示例代码 动力学模拟 高级功能 退相干和噪声模拟 控制和优化 量子信息学工具 实际应用场景 量子态演化研究 量子计算机模拟 量子纠错协议 总结 前言 大家好,今天为大家分享一个高级的 Pytho…

CSS-浮动文字环绕布局、隐藏属性display、overflow、三角形制作、鼠标样式

文字环绕布局 CSS文字环绕布局是指在网页中让文字环绕在图片或其他元素周围的布局方式。这通常通过CSS中的float属性来实现。你可以将图片设置为float: left;或float: right;,然后在文本元素中使用clear属性来清除浮动,以确保文字不会覆盖图片。另外&am…

五款高性价比运动耳机,让你告别音乐束缚畅享运动时光!

在这个繁忙的都市里,我们时常被各种琐事所困扰,渴望逃离城市的喧嚣,去寻找一片宁静的天地。而大自然,正是我们心灵的避风港。当我们放下心中的烦恼,走进大自然的怀抱,我们会发现,原来生活可以如…

Centos 7.9.2009 下 Gitlab 完全卸载

一、linux版本:lsb_release -a 二、GtiLab 版本 # 查看gitlab的版本号 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 三、开始卸载 3.1,停止Gitlab 相关服务 # 停止所有GitLab相关服务: sudo gitlab-ctl stop# 移除GitLab包…

大厂面试:获取字符串的全排列

一、概念 现有一个字符串,要打印出该字符串中字符的全排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 可以基于回溯法来解决这个问题。 二、代码 public class Permutation {//输出字符串str的全…

【自然语言】使用词袋模型,TF-IDF模型和Word2Vec模型进行文本向量化

一、任务目标 python代码写将 HarryPorter 电子书作为语料库,分别使用词袋模型,TF-IDF模型和Word2Vec模型进行文本向量化。 1. 首先将数据预处理,Word2Vec 训练时要求考虑每个单词前后的五个词汇,地址为 作为其上下文 &#xf…

Centos7 搭建Mongodb 分片集群4.0/ PSA(三成员副本集)

MongoDB 简介:1、优点和缺点:2、MongoDB适用的业务场景:Centos7 搭建Mongodb 分片集群一、安装MongoDB社区版4.01、配置程序包管理系统(`yum`)2、安装对应版本的MongoDB软件包。3、创建运行mongodb的目录并禁用SELinux4、修改文件打开数5、初始化系统5.1、创建config配置…

基于Springboot的自习室预订系统

基于SpringbootVue的自习室预订系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录页 网站首页 公告信息 留言反馈 后台管理 学生信息管理 公告信息管理 留言…

书生·浦语大模型实战营 | 第3次学习笔记

前言 书生浦语大模型应用实战营 第二期正在开营,欢迎大家来学习。(参与链接:https://mp.weixin.qq.com/s/YYSr3re6IduLJCAh-jgZqg 第三堂课的视频链接:https://www.bilibili.com/video/BV1QA4m1F7t4/ 本次笔记是学习完第三堂课…

CentOS 网卡ifcfg-eth0 ping不通外网(www.baidu.com)

1、如果确认好就直接激活网卡! ifup eth0 2、慢慢找: cd /etc/sysconfig/network-scripts/ ls 找到你的网卡是啥,这里网卡是 ifcfg-eth0 执行1就好了!