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 实现环境感知的自动配置
相关推荐
Helix2501 小时前
Windows ETW与KQL实战:终端性能诊断与遥测数据分析指南
windows·性能诊断·kql·etw·azure monitor·遥测数据·tracert
陈葛杰2 小时前
Adobe Premiere Pro2025安装教程
windows·adobe·开源软件·1024程序员节
承渊政道4 小时前
iOS远程控制电脑用什么好?iPhoneiPad远程控制Windows电脑最佳方案2026横评
windows·ios·远程控制·1024程序员节·iphone ipad
易点云徐源4 小时前
PDF 默认打开方式刚修好,过一分钟又变成“未知应用”?使用 ProcMon 成功抓出后台程序
windows·pdf
我是大猴子4 小时前
py how claude work项目分析
运维·服务器·windows·1024程序员节
paul_chen2120 小时前
解决Windows “此电脑”出现两个“图片”文件夹的问题
windows
SoulRoar.21 小时前
在 Windows 上面部署 StartLux
windows·大模型·startlux
爱吃提升21 小时前
DirectX修复工具安装配置教程-运行权限检测修复与运行库更新参数速查
windows
ddshub_cc1 天前
Claude Code 接入 DDS Hub:Windows/macOS 配置、验证与报错排查
windows·macos·ai编程·claude·codex·ai模型·aiapi
第25小时记录1 天前
[windows] windows下将文件夹映射为磁盘
windows