spring boot 3

一、Bean 扫描机制

SpringBoot 简化了传统 Spring 的组件扫描配置,核心规则如下:

1. 传统配置方式

  • XML 配置:<context:component-scan base-package="com.itheima"/>
  • 注解配置:@ComponentScan(basePackages = "com.itheima")

2. SpringBoot 自动扫描规则

  • @SpringBootApplication 注解默认包含 @ComponentScan,默认扫描启动类所在包及其所有子包。
  • 项目结构示例:启动类 SpringbootQuickstartApplication 位于 com.itheima.springbootquickstart 包下,会自动扫描该包及 controller、service 等子包下的所有组件。

二、Bean 注册的四种方式

1. 自定义 Bean:@Component 及其衍生注解

适用于自己编写的类,通过注解标记后被自动扫描注册。

表格

注解 说明 适用场景
@Component 基础注解,标记为 Spring 组件 不属于以下三类的通用类
@Controller @Component 衍生注解 标注在控制器类上
@Service @Component 衍生注解 标注在业务逻辑类上
@Repository @Component 衍生注解 标注在数据访问类上(MyBatis 场景下使用较少)

2. 第三方 Bean:@Bean 注解

适用于无法直接修改源码的第三方类(如工具类、框架类),通过配置类注册。

基础用法

java

运行

复制代码
// 推荐:单独配置类,集中管理第三方 Bean
@Configuration
public class CommonConfig {
    @Bean
    public Resolver resolver() {
        return new Resolver(); // Resolver 为第三方类
    }
}

⚠️ 不建议直接在启动类中使用 @Bean,会导致代码混乱,不利于维护。


3. 第三方 Bean:@Import 注解

适用于批量导入配置类或实现 ImportSelector 接口动态导入类。

方式 1:直接导入配置类

java

运行

复制代码
@SpringBootApplication
@Import(CommonConfig.class) // 导入配置类,其中的 @Bean 会被注册
public class SpringbootRegistApplication {
}
方式 2:实现 ImportSelector 接口

通过接口实现类动态返回需要导入的类全限定名,可从配置文件读取导入类。

java

运行

复制代码
public class CommonImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // 从配置文件读取要导入的类
        List<String> imports = new ArrayList<>();
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(CommonImportSelector.class.getClassLoader()
                        .getResourceAsStream("common.imports")))) {
            String line;
            while ((line = br.readLine()) != null) {
                imports.add(line);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return imports.toArray(new String[0]);
    }
}

在启动类中导入:

java

运行

复制代码
@SpringBootApplication
@Import(CommonImportSelector.class)
public class SpringbootRegistApplication {
}
方式 3:@EnableXxxx 注解

封装 @Import 注解,例如 @EnableWebMvc、@EnableTransactionManagement,本质是通过注解触发 @Import 导入相关配置类。


三、Bean 注册条件控制:@Conditional 系列注解

SpringBoot 提供了条件注解,只有满足条件时,Bean 才会被注册到 IOC 容器中。

表格

注解 生效条件
@ConditionalOnProperty 配置文件中存在指定属性时,才注册该 Bean
@ConditionalOnMissingBean 容器中不存在当前类型的 Bean 时,才注册该 Bean
@ConditionalOnClass 当前环境中存在指定类时,才注册该 Bean

示例:

java

运行

复制代码
@Bean
@ConditionalOnProperty(prefix = "oss", name = "enabled", havingValue = "true")
public OssClient ossClient() {
    // 只有配置文件中 oss.enabled=true 时,才注册 OssClient
    return new OssClient();
}

四、核心总结

表格

注册方式 适用场景 优点
@Component 及其衍生注解 自定义类 简单直接,自动扫描
@Bean 第三方类、需自定义创建逻辑的类 灵活控制 Bean 创建过程
@Import 批量导入配置、动态导入类 支持配置文件驱动的动态导入
@Conditional 系列 按条件注册 Bean 实现环境感知的自动配置
相关推荐
搬砖的小码农_Sky8 小时前
AI Agent:如何处理Claude Code 最近版本(2026年更新)引入的模型上下文限制
人工智能·windows·ai·ai编程
kakakahahahaha9 小时前
Windows C盘临时文件清理:%temp%、Windows Temp、Prefetch、Windows.old与hiberfil.sys处理指南
c语言·开发语言·windows
山岚的运维笔记12 小时前
ComfyUI NVIDIA安装教程:官方便携版下载+run_nvidia_gpu.bat启动,8G显存Windows实操
运维·服务器·windows·笔记·prompt·aigc·comfyui
kakakahahahaha14 小时前
LoadLibrary failed with error 87 排查:ERROR_INVALID_PARAMETER、DLL路径、架构与显卡驱动
windows·电脑·笔记本电脑·nvidia·软件需求
百事牛科技16 小时前
7Z分卷文件怎么打开?7-Zip解压方法详解
windows·7-zip
2301_7893804920 小时前
【踩坑记录】Windows资源管理器无限重启,改注册表、看日志
windows·经验分享·笔记
sukalot20 小时前
Windows 驱动实例分析系列:libwdi 驱动分析 - libwdi 篇(五)
windows·驱动开发
(Charon)20 小时前
【C/C++面试】手写内存池:从空闲链表到内存申请与释放
java·开发语言·windows
CS创新实验室21 小时前
Python 的鸭子类型
开发语言·windows·python
kakakahahahaha21 小时前
电脑显示器无信号排查:HDMI/DP接口、独立显卡、内存与安全模式
windows·安全·电脑·笔记本电脑·内容运营·软件需求