springboot系列 @ComponentScan和@EnableAutoConfiguration的区别

2023-11-02

研究springboot源码,在网上看相关博客的时候对@ComponentScan和@EnableAutoConfiguration两者之间的作用没有做过多的区分,导致我觉得他们两者都有扫描相关组建然后将符合要求的放入到ioc容器中。所以我就占牛角尖了,单独研究了一下他们的不同点。
@ComponentScan和@EnableAutoConfiguration都是包含在@SpringBootApplication中的,也是@SpringBootApplication中比较重要的注解。
@ComponentScan和@EnableAutoConfiguration的相同点
两者都可以将带有@Component,@Service等注解的对象加入到ioc容器中。

@ComponentScan和@EnableAutoConfiguration的不同点
1.两者虽然都能将带有注解的对象放入ioc容器中,但是它们扫描的范围是不一样的。@ComponentScan扫描的范围默认是它所在的包以及子包中所有带有注解的对象,@EnableAutoConfiguration扫描的范围默认是它所在类。
2.它们作用的对象不一样,@EnableAutoConfiguration除了扫描本类带有的注解外,还会 借助@Import的支持,收集和注册依赖包中相关的bean定义,将这些bean注入到ioc容器中,在springboot中注入的bean有两部分组成,一部分是自己在代码中写的标注有@Controller,@service,@Respority等注解的业务bean,这一部分bean就由@ComponentScan将它们加入到ioc容器中,还有一部分是springboot自带的相关bean,可以将这部分bean看成是工具bean,这部分bean就是由@EnableAutoConfiguration负责加入到容器中。
3.@EnableAutoConfiguration可以单独启动springboot项目,而@ComponentScan是不能的。

下面用代码来验证第一点和第三点


第一种情况,验证@EnableAutoConfiguration的扫描范围

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import study.springboot.component.subPackage.Food;

/**
 * @Author wangbiao
 * @Date 2019-09-01 09:49
 * @Decripition TODO
 **/
@RestController
@EnableAutoConfiguration
public class DogController {


    @RequestMapping(value = "showDog",name = "测试@Component,@EnableAutoConfiguration扫描范围")
    public String showDog(){
        return "中华田园犬";
    }


    public static void main(String[] args) {
        SpringApplication.run(DogController.class,args);
    }


}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import study.springboot.component.subPackage.Food;

/**
 * @Author wangbiao
 * @Date 2019-09-01 10:00
 * @Decripition TODO
 **/
@RestController
public class CatController {
    @RequestMapping(value = "showCat",name = "测试@Component,@EnableAutoConfiguration扫描范围")
    public String showCat(){
        return "波斯猫";
    }
}

然后用http://localhost:8080/showDog来访问,得到的结果是:

http://localhost:8080/showCat访问,得到的结果是:

得到的结果是@EnableAutoConfiguration不能将同一个包下带有注解的对象加入到ioc容器中

下面验证@EnableAutoConfiguration能否将子包中的注解对象加入到ioc容器中

import org.springframework.stereotype.Component;

/**
 * @Author wangbiao
 * @Date 2019-09-19 10:47
 * @Decripition TODO
 **/
@Component
public class Food {
    private String foodname="狗粮,猫粮";

    public String getFoodname() {
        return foodname;
    }

    public void setFoodname(String foodname) {
        this.foodname = foodname;
    }
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import study.springboot.component.subPackage.Food;

/**
 * @Author wangbiao
 * @Date 2019-09-01 09:49
 * @Decripition TODO
 **/
@RestController
@EnableAutoConfiguration
public class DogController {

    @Autowired
    private Food food;
    @RequestMapping(value = "showDog",name = "测试@Component,@EnableAutoConfiguration扫描范围")
    public String showDog(){
        return "中华田园犬"+food.getFoodname();
    }


    public static void main(String[] args) {
        SpringApplication.run(DogController.class,args);
    }


}

启动就报错了:

可以看到@EnableAutoConfiguration是不能将子包中的注解对象加入到ioc容器中。
 

第二种情况,验证@Component的扫描范围
在@EnableAutoConfiguration注解上面加上@Component

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import study.springboot.component.subPackage.Food;

/**
 * @Author wangbiao
 * @Date 2019-09-01 09:49
 * @Decripition TODO
 **/
@ComponentScan
@RestController
@EnableAutoConfiguration
public class DogController {

    @Autowired
    private Food food;
    @RequestMapping(value = "showDog",name = "测试@Component,@EnableAutoConfiguration扫描范围")
    public String showDog(){
        return "中华田园犬"+food.getFoodname();
    }


    public static void main(String[] args) {
        SpringApplication.run(DogController.class,args);
    }


}

http://localhost:8080/showDog访问,结果是下面的页面,可以看出Food这个对象是被引进来了的

再用http://localhost:8080/showCat访问页面,得到的结果是下面的页面,可以看出CatController是被加入到容器中的。所以验证了第一点,@ComponentScan扫描的范围默认是它所在的包以及子包中所有带有注解的对象,@EnableAutoConfiguration扫描的范围默认是它所在类。
感谢这篇博客提供的参考:https://blog.csdn.net/qq_39404626/article/details/83995870

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot系列 @ComponentScan和@EnableAutoConfiguration的区别 的相关文章

随机推荐

  • 数据挖掘中常用的数据清洗方法有哪些?

    原文来自 https www zhihu com question 22077960 answer 24095218 从两个角度上看 数据清洗一是为了解决数据质量问题 二是让数据更适合做挖掘 不同的目的下分不同的情况 也都有相应的解决方式和
  • 网络编程 用代码创建进程

    创建进程的多种方式 1 鼠标双击启动图标 2 使用代码创建应用进程 如何用代码创建进程 python中有跟进程相关的模块multiprocessing 意思为多进程 from multiprocessing import Process i
  • Java 多线程写同一个文件实现

    最近项目中需要从网站上抓取大量的数据 采用了多线程技术 每个线程抓取的数据都需要保存到一个文件中 避免消耗大量的内存 思路 多个访问线程将需要写入到文件中的数据先保存到一个队列里面 然后由专门的 写出线程负责从队列中取出数据并写入到文件中
  • Activity启动源码分析

    我会思考的是 activity的启动过程是什么样的呢 是什么原理呢 有哪些好的地方 哪些不好的地方呢 可不可以更好呢 首先 是会执行到startActivityForResult 然后会执行Instrumention的execStartAc
  • GDB调试-小试牛刀

    This is the GNU debugger Usage gdb options executable file core file or process id gdb options args executable file infe
  • vue自定义组件+Dialog 对话框组件定制弹出框教程

    1 新建一个 vue页面 写一个Dialog组件 把弹出框上想要展示的内容放进去
  • 学习笔记(97):R语言入门基础-pairs绘图

    立即学习 https edu csdn net course play 24913 285841 utm source blogtoedu pairs函数 m matrix 1 16 nrow 4 pairs m 对应结果 df data
  • prettier 配置

    使用 VS Code 开发的时候会配合 prettier 来进行代码格式化 这里贴出一份 prettier 配置 所有的配置都是默认配置 注释中也有表明相关的网站 options 是使用 google 翻译的 可能有翻译的不准确的地方 不过
  • 使用tensorflow训练模型时可能出现nan的几种情况

    最近在做基于MTCNN的人脸识别和检测的项目 在训练模型的过程中总是会不定时地出现损失值为nan的情况 Debug了好久终于找到了问题所在 这里总结以下可能出现nan的几种情况 1 在分类问题中 我们经常使用到交叉熵损失函数 需要注意的是
  • thymeleaf加载数据失败

    在使用thymeleaf进行传送模型数据的时候 发现只有return数据 没有对应的页面 后台代码如下 前端代码如下 应该将 RestController 改成 Controller 测试成功 原因 如果使用 RestController注
  • idea如何开启Run Dashboard

    1 使用场景 IDEA开发工具中以 run 或 debug 方式启动多个 SpringBoot 应用时 日志控制台排开在窗口上方 服务间调用涉及日志追踪时 不方便快速切换来查看日志信息 如下图所示 IDEA提供了强大Dashboard功能
  • css的层叠顺序

    css中用z index来控制定位元素的层叠顺序 z index integer auto 整数值越大 元素离我们越近 一旦给一个定位元素设定了z index的值 不是auto 那么它就为它的所有后代建立了一个新的局部层叠上下文 如
  • Kafka系统学习

    Kafka学习视频 文章目录 一 Kafka 概述 二 消息队列 传统消息队列的应用场景 使用消息队列的好处 消息队列的 两种模式 三 Kafka 基础架构 四 Docker安装 Kafka Kafka命令行 六 Kafka架构深入 Kaf
  • VMware Pro下Centos 8虚拟机网络配置与克隆

    网络配置对于小白来讲是非常麻烦的 所以针对VMware Pro下的虚拟机网络配置进行记录 另外也会记录一下克隆虚拟机的一个过程 这个对测试集群的部署是非常有用的 注意一定是VMware Pro 因为Player免费版无网络配置功能 环境安装
  • 浪潮服务器更换硬盘_浪潮K1 Power E950百万豪机拆机指南

    不久前 浪潮商用机器一位架构师背着老板把浪潮K1 Power Linux服务器给 解剖 了 但是有网友质疑说顶多算半个拆机 不过瘾 安排 不过这次拆的可是价值百万的豪华机型 浪潮K1 Power E950 价值百万可不是随口说说 不信 看基
  • 数据库——MYSQL复习

    单表查询 1 查询指定列 select id name from t student 2 查询全部列 select from t student 3 查询经过计算的值 select id age 18 from t student 4 消除
  • 接口测试持续集成详解

    一 持续集成概述 1 持续集成简介 持续集成 Continuous Integration 简称CI 是一种软件开发实践 即团队开发成员经常集成他们的工作 通常每个成员每天至少集成一次 也就意味着每天可能会发生多次集成 持续集成的目的 让产
  • eclipse 找不到或无法加载主类 ClassNotFoundException

    项目右键 Builde path gt Configure Build Path gt
  • 02 编程语言与Python介绍

    编程语言与Python介绍 一 引子 二 编程语言分类 2 1 机器语言 2 2 汇编语言 2 3 高级语言 2 3 1 编译型 如C语言 2 3 2 解释型 如python 2 4 总结 三 Python介绍 3 1 Python解释器的
  • springboot系列 @ComponentScan和@EnableAutoConfiguration的区别

    研究springboot源码 在网上看相关博客的时候对 ComponentScan和 EnableAutoConfiguration两者之间的作用没有做过多的区分 导致我觉得他们两者都有扫描相关组建然后将符合要求的放入到ioc容器中 所以我