Spring Boot 自动配置原理

1. 自动配置

Spring Boot 通过自动配置简化了开发中的大量配置任务,开发者不再需要手动声明 Bean 对象,Spring Boot 会根据需要自动将常用的 Bean 加入 IOC 容器。例如,事务管理、AOP 等自动配置都是 Spring Boot 启动时通过自动加载配置类实现的。

原理

启动类上的@SpringBootApplication注解中包含了以下注解:

  • Spring Boot 使用 @EnableAutoConfiguration 注解来开启自动配置,该注解内部使用 @Import 注解导入了 ImportSelector 接口的实现类 AutoConfigurationImportSelector

  • AutoConfigurationImportSelector 会读取 spring.factories 文件中的配置类,并将这些配置类加载到 IOC 容器中。

2. 条件装配 (@Conditional)

自动配置中的 Bean 注册通常会附带条件装配的注解,例如 @ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty。这些注解根据特定条件决定是否将 Bean 加入 IOC 容器:

  • @ConditionalOnClass :当类路径中存在指定的类时,才创建 Bean

  • @ConditionalOnMissingBean :当容器中不存在指定类型的 Bean 时,才创建 Bean

  • @ConditionalOnProperty :当配置文件中存在特定属性时,才创建 Bean

3. 自动配置原理总结

自动配置的核心就在@SpringBootApplication注解上,SpringBootApplication这个注解底层包含了3个注解@SpringBootConfiguration 、@ComponentScan 、@EnableAutoConfiguration。

@EnableAutoConfiguration这个注解才是自动配置的核心。

(1)它封装了一个@Import注解,Import注解里面指定了一个ImportSelector接口的实现类。

(2)在这个实现类中,重写了ImportSelector接口中的selectImports()方法。

(3)而selectImports()方法中会去读取两份配置文件,并将配置文件中定义的配置类做为 selectImports()方法的返回值返回,返回值代表的就是需要将哪些类交给Spring的IOC容器进行管理。

(4)那么所有自动配置类的中声明的bean都会加载到Spring的IOC容器中吗? 其实并不会,因 为这些配置类中在声明bean时,通常都会添加@Conditional开头的注解,这个注解就是进 行条件装配。而Spring会根据Conditional注解有选择性的进行bean的创建。

(5)@Enable 开头的注解底层,它就封装了一个注解 import 注解,它里面指定了一个类,是 ImportSelector 接口的实现类。在实现类当中,我们需要去实现 ImportSelector接口当中的一个方法 selectImports 这个方法。这个方法的返回值代表的就是我需要将哪些类交给 spring 的 IOC容器进行管理。

(6)此时它会去读取两份配置文件,一份儿是 spring.factories,另外一份儿是 autoConfiguration.imports。而在 autoConfiguration.imports 这份儿文件当中,它就会去配置大量的自动配置的类。

(7)而前面我们也提到过这些所有的自动配置类当中,所有的 bean都会加载到 spring 的 IOC 容器当中吗?其实并不会,因为这些配置类当中,在声明 bean 的时候,通常会加上 这么一类@Conditional 开头的注解。这个注解就是进行条件装配。所以SpringBoot非 常的智能,它会根据 @Conditional 注解来进行条件装配。只有条件成立,它才会声明这个bean,才会将这个 bean 交给 IOC 容器管理。

4. SSM

SpringMVC不是一个单独的框架,它是Spring框架的一部分,是Spring框架中的web开发模块,是用来简化原始的Servlet程序开发的。

俗称的SSM,就是由:SpringMVC、Spring Framework、Mybatis三块组成。

基于传统的SSM框架进行整合开发项目会比较繁琐,而且效率也比较低,所以在现在的企业项目开发当中,基本上都是直接基于SpringBoot整合SSM进行项目开发的。

相关推荐
都叫我大帅哥几秒前
Embabel 1.0 Agent Framework 完全指南:从入门到生产级实践
java
程序员爱钓鱼1 分钟前
Rust Borrow借用详解:不转移所有权访问数据
后端·面试·rust
zhongjunyao6 分钟前
Spec-Driven Development (SDD): The Definitive 2026 Guide
javascript·spring boot·python·eclipse·代理模式
福大大架构师每日一题7 分钟前
agno v2.8.7 发布:顾问模型、精准路线、调度能力全面升级,10项关键修复一次看懂
java·开发语言·数据库
程序员爱钓鱼9 小时前
Rust Copy详解:隐式复制与轻量数据类型
前端·后端·rust
Patrick在香港9 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术9 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫9 小时前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话9 小时前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
仙人球部落 揞殺9 小时前
细说ASP.NET的各种异步操作
后端·asp.net