【IoCDI】_Spring的基本扫描机制

news/2025/2/9 1:40:34/

目录

1. 创建测试项目

2. 改变启动类所属包 

3. 使用@ComponentScan

4. Spring基本扫描机制


程序通过注解告诉Spring希望哪些bean被管理,但在仅使用@Bean时已经发现,Spring需要根据五大类注解才能进一步扫描方法注解。

由此可见,Spring对注解的扫描并不是全项目扫描的,本文对Spring的基本扫描机制进行验证。

1. 创建测试项目

创建项目及Controller包、Service包、Repo包、Component包、Config包,目录结构如下:

本例测试与Controller包下的UserController类 和 Service包下的UserService类相关,

UserController类内容如下:

java">package com.example.iocdemo1.Controller;import org.springframework.stereotype.Controller;@Controller
public class UserController {public void doController(){System.out.println("do Controller...");}
}

UserService类内容如下:

java">package com.example.iocdemo1.Service;import org.springframework.stereotype.Service;@Service
public class UserService {public void doService(){System.out.println("doService...");}
}

启动类内容如下:

java">package com.example.iocdemo1.Controller;import com.example.iocdemo1.Service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;@SpringBootApplication
public class IoCDemo1Application {public static void main(String[] args) {ApplicationContext context=SpringApplication.run(IoCDemo1Application.class, args);UserController controller = context.getBean(UserController.class);controller.doController();UserService userService1=context.getBean(UserService.class);userService1.doService();}
}

2. 改变启动类所属包 

现将启动类移至项目包的其他子包下,以Controller包为例:

基于其他目录结构及类代码不变,重新启动程序,报错如下:

表示UserService.class这个bean没有找到(类型为UserController.class的bean获取成功,并未报错)。

在SpringBoot中有一个特点:约定大于配置。由于原始Spring项目大量的配置文件造成的不便,SpringBoot做了相关约定以简化配置。

Spring约定,从启动类所在的目录及其子孙目录开始扫描

观察启动类首行,可见移动启动类位置后,移动类所属包:

java">package com.example.iocdemo1.Controller;

故而Spring默认只扫描该目录下的包及子包,可扫描到UserController,但扫描不到UserService;

3. 使用@ComponentScan

在当前启动类前增加@ComponentScan注解以指定扫描目录路径,当前若希望扫描到其他的Service包、Repo包、Component包、Config包,则需对应的路径为com.example.iocdemo1,增加注解后的启动类内容如下:

java">package com.example.iocdemo1.Controller;import com.example.iocdemo1.Service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;@ComponentScan("com.example.iocdemo1")
@SpringBootApplication
public class IoCDemo1Application {public static void main(String[] args) {ApplicationContext context=SpringApplication.run(IoCDemo1Application.class, args);UserController controller = context.getBean(UserController.class);controller.doController();UserService userService1=context.getBean(UserService.class);userService1.doService();}
}

重新启动程序:

4. Spring基本扫描机制

1、根据上例,可得出Spring对注解的扫描约定如下:

默认扫描路径为启动类所在的目录及其子孙目录,可通过@ComponentScan注解指定扫描路径

2、在项目默认配置中,并没有手动使用@ComponentScan指定扫描路径,默认扫描路径是通过启动类的@SpringBootApplication注解实现的,Alt+左点击查看注解声明:

可见@SpringBootApplication注解当中包含@ComponentScan注解。


http://www.ppmy.cn/news/1570471.html

相关文章

ChatGPT提问技巧:行业热门应用提示词案例--咨询法律知识

ChatGPT除了可以协助办公,写作文案和生成短视频脚本外,和还可以做为一个法律工具,当用户面临一些法律知识盲点时,可以向ChatGPT咨询获得解答。赋予ChatGPT专家的身份,用户能够得到较为满意的解答。 1.咨询法律知识 举…

Redis企业开发实战(三)——点评项目之优惠券秒杀

目录 一、全局唯一ID (一)概述 (二)全局ID生成器 (三)全局唯一ID生成策略 1. UUID (Universally Unique Identifier) 2. 雪花算法(Snowflake) 3. 数据库自增 4. Redis INCR/INCRBY 5.总结 (四)Redis实现全局唯一ID 1.工具类 2.测试类 3…

预训练语言模型(笔记)

笔记来源:Transformer、GPT、BERT,预训练语言模型的前世今生(目录) - B站-水论文的程序猿 - 博客园 预训练语言模型的发展并不是一蹴而就的,而是伴随着诸如词嵌入、序列到序列模型及 Attention 的发展而产生的。 一、…

7.PPT:“中国梦”学习实践活动【20】

目录 NO1234​ NO5678​ NO9\10\11 NO1234 考生文件夹下创建一个名为“PPT.pptx”的新演示文稿Word素材文档的文字:复制/挪动→“PPT.pptx”的新演示文稿(蓝色、黑色、红色) 视图→幻灯片母版→重命名:“中国梦母版1”→背景样…

【Elasticsearch】Global 聚合

7. 总结全局聚合是 Elasticsearch 中一个非常强大的工具,它允许你在执行特定查询的同时,对整个数据集进行统计分析。通过合理使用全局聚合,可以实现多维度的数据分析,帮助你更好地理解数据的整体情况和特定条件下的差异。希望这些…

Facebook矩阵营销:多维度布局,精准打击

随着社交媒体的迅猛发展,企业和品牌在数字营销中的竞争愈发激烈。Facebook,作为全球最大的社交平台之一,已成为了品牌推广的关键阵地之一。然而,仅仅依靠单一的Facebook页面进行营销已经无法满足品牌发展的需求,如何通…

微信小程序~电器维修系统小程序

博主介绍:✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

@emotion/styled / styled-components创建带有样式的 React 组件

一、安装依赖 npm install emotion/styled styled-components 二、使用 import styled from emotion/styled; import styled from styled-components;// 创建一个带样式的按钮 const StyledButton styled.buttonbackground-color: #4caf50;color: white;padding: 10px 20px…