当前位置: 首页 > ops >正文

Spring Boot 的自动装配

1. 自动装配的核心机制

1.1 @SpringBootApplication 注解

@SpringBootApplication 是 Spring Boot 的核心注解,它是一个组合注解,包含以下三个注解:

  • @SpringBootConfiguration:标识当前类是一个 Spring Boot 的配置类。

  • @EnableAutoConfiguration:启用 Spring Boot 的自动装配功能。

  • @ComponentScan:启用组件扫描,扫描当前包及其子包中的 Spring Bean。

@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
1.2 @EnableAutoConfiguration

@EnableAutoConfiguration 是自动装配的关键注解,它通过 @Import 注解引入了 AutoConfigurationImportSelector 类。AutoConfigurationImportSelector 是一个特殊的类,负责加载和应用自动装配的配置类。

@EnableAutoConfiguration
public class MyApplication {
}
1.3 AutoConfigurationImportSelector

AutoConfigurationImportSelector 是自动装配的核心实现类。它通过以下步骤加载自动装配的配置类:

  1. 加载 spring.factories 文件: Spring Boot 在启动时会扫描所有 META-INF/spring.factories 文件,这些文件中定义了需要加载的自动装配类。 例如

    # spring-boot-autoconfigure-<version>/META-INF/spring.factories
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,...
  2. 条件判断: 每个自动装配类都使用了 @Conditional 注解(如 @ConditionalOnClass@ConditionalOnMissingBean 等),这些注解定义了自动装配类的加载条件。Spring Boot 会根据这些条件判断是否加载某个自动装配类。

    例如:

    @Configuration
    @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
    @ConditionalOnMissingBean(DataSource.class)
    public class DataSourceAutoConfiguration {// 配置数据源
    }
  3. 加载配置类: 如果条件满足,Spring Boot 会将对应的自动装配类加载到 Spring 容器中。

2. 自动装配的条件判断

Spring Boot 提供了一系列条件注解,用于控制自动装配类的加载。常见的条件注解包括:

  • @ConditionalOnClass:当类路径中存在指定的类时,加载配置。

  • @ConditionalOnMissingClass:当类路径中不存在指定的类时,加载配置。

  • @ConditionalOnBean:当 Spring 容器中存在指定的 Bean 时,加载配置。

  • @ConditionalOnMissingBean:当 Spring 容器中不存在指定的 Bean 时,加载配置。

  • @ConditionalOnProperty:当指定的配置属性存在时,加载配置。

  • @ConditionalOnExpression:当 SpEL 表达式为 true 时,加载配置。

3. 自动装配的实现步骤

3.1 启动类加载

当 Spring Boot 应用启动时,SpringApplication 会加载启动类(如 MyApplication),并解析 @SpringBootApplication 注解。

3.2 加载 spring.factories 文件

SpringApplication 会扫描所有 META-INF/spring.factories 文件,加载其中定义的自动装配类。

3.3 条件判断

对于每个自动装配类,Spring Boot 会检查其上的条件注解(如 @ConditionalOnClass@ConditionalOnBean 等),判断是否满足加载条件。

3.4 加载配置类

如果条件满足,Spring Boot 会将对应的自动装配类加载到 Spring 容器中,并执行其中的配置逻辑。

4. 自定义自动装配

开发者可以通过以下步骤自定义自动装配:

  1. 创建自动装配类: 创建一个带有 @Configuration 注解的类,并在其中定义需要的 Bean

    @Configuration
    @ConditionalOnClass(MyService.class)
    @ConditionalOnMissingBean(MyService.class)
    public class MyAutoConfiguration {@Beanpublic MyService myService() {return new MyService();}
    }
  2. 注册自动装配类: 在项目的 resources/META-INF/spring.factories 文件中添加自定义自动装配类的全限定名

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.example.MyAutoConfiguration

5. 总结

Spring Boot 的自动装配通过以下机制实现:

  • @SpringBootApplication 注解:启用自动装配功能。

  • @EnableAutoConfiguration 注解:引入 AutoConfigurationImportSelector

  • AutoConfigurationImportSelector:加载 spring.factories 文件中的自动装配类。

  • 条件注解:通过 @Conditional 注解控制自动装配类的加载。

  • 自定义自动装配:开发者可以通过创建自动装配类并注册到 spring.factories 文件中,自定义自动装配逻辑。

通过自动装配,Spring Boot 能够根据项目依赖和配置自动加载合适的配置,大大简化了 Spring 应用的开发过程。

http://www.xdnf.cn/news/10908.html

相关文章:

  • C++学者给您讲数学之——数列
  • 星野录(博客系统)测试报告
  • 在 Ubuntu 系统上使用 Python 的 Matplotlib 库时遇到的字体缺失问题
  • 武器的攻击判定
  • 多层 PCB 板抄板实操解析:技巧到实操步骤
  • Spring Boot 自动配置原理:从入门到精通
  • MySQL强化关键_019_索引优化
  • ​库存周转战争:用数据驱动取代经验主义,让资金活起来​
  • 7.5- Loading a pretrained LLM
  • 【25.06】FISCOBCOS安装caliper+报错解决
  • Python 元组方法全集详解
  • 登录vmware vcenter报vSphere Client service has stopped working错误
  • H.264编码
  • Axure设计案例:滑动拼图解锁
  • 深度学习介绍
  • web程序设计期末复习-简答题
  • 操作系统 第 39 章 插叙:文件和目录
  • 如何实现RAG与MCP集成
  • 多任务学习(Multi-Task Learning, MTL)
  • unity UI Rect Transform“高”性能写法
  • 52. N 皇后 II【 力扣(LeetCode) 】
  • 网络攻防技术九:网络监听技术
  • Dispatch PDI V2.04 发布预告
  • Ros2 简单构建项目的流程以及涉及的文件作用
  • WAF绕过,网络层面后门分析,Windows/linux/数据库提权实验
  • 【时时三省】(C语言基础)数组作为函数参数
  • 解决Vditor加载Markdown网页很慢的问题(Vite+JS+Vditor)
  • 二分查找和二分答案(基础)
  • C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
  • 【Doris基础】Apache Doris中的Fragment概念详解