(Spring)Spring Boot 自动装配原理总结

Spring Boot 的自动装配(Auto-Configuration)是其核心特性之一,使开发者可以**"开箱即用"**,无需手动配置大量 Bean,极大地提高了开发效率。


一、自动装配的概念

自动装配是指 根据 classpath、已有 Bean 和应用配置,自动为 Spring 容器注入所需的 Bean,而无需手动配置。例如:

java 复制代码
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

引入 spring-boot-starter-web 后,Spring Boot 会自动装配:

  • DispatcherServlet

  • Tomcat 或其他容器

  • JSON 转换器等 Web 相关组件


二、自动装配的实现原理

1. @SpringBootApplication

  • 核心注解,组合了:

    • @SpringBootConfiguration → 声明配置类

    • @EnableAutoConfiguration → 开启自动装配

    • @ComponentScan → 扫描组件

  • 自动装配的关键是 @EnableAutoConfiguration

2. @EnableAutoConfiguration

  • 本质上是:
java 复制代码
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
  • 导入 AutoConfigurationImportSelector,负责读取和选择自动配置类

3. AutoConfigurationImportSelector 流程

  1. 读取自动配置类

    Spring Boot 在 META-INF/spring.factories 文件中定义了大量自动配置类:

XML 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
  1. 条件判断

    每个自动配置类通常使用 @Conditional 系列注解:

    • @ConditionalOnClass → 当 classpath 存在指定类时生效

    • @ConditionalOnMissingBean → 当容器中没有该 Bean 时生效

    • @ConditionalOnProperty → 根据配置文件属性生效

示例:

java 复制代码
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}
  1. 注册 Bean 到容器

    符合条件的配置类会被解析为普通 @Configuration,注册对应 Bean 到 Spring 容器中。


三、核心条件注解

注解 作用
@ConditionalOnClass classpath 中存在指定类时生效
@ConditionalOnMissingBean 容器中不存在指定 Bean 时生效
@ConditionalOnBean 容器中存在指定 Bean 时生效
@ConditionalOnProperty 配置文件中存在指定属性时生效

四、整体流程总结

  1. Spring Boot 启动,扫描 @SpringBootApplication

  2. @EnableAutoConfiguration 导入 AutoConfigurationImportSelector

  3. 读取 spring.factories 中的自动配置类

  4. 对每个自动配置类进行条件判断

  5. 符合条件的 Bean 注册到容器

  6. 应用即可直接使用自动装配的组件


五、面试回答精炼版

Spring Boot 自动装配通过 @EnableAutoConfiguration 导入 AutoConfigurationImportSelector 实现,它读取 spring.factories 中的自动配置类,并根据 @Conditional 条件判断是否注册 Bean,从而实现开箱即用。

相关推荐
椎4952 小时前
java微服务01-快速入门、mybatisplus
java·微服务
为什么不问问神奇的海螺呢丶2 小时前
n9e categraf k8s监控配置-n9e k8s监控看板
java·容器·kubernetes
浩浩测试一下2 小时前
内网---> ForceChangePassword 权限滥用
java·服务器·网络·安全·web安全·网络安全·系统安全
独自破碎E2 小时前
【BISHI11】变幻莫测
android·java·开发语言
qq_12498707532 小时前
基于Javaweb的《战舰世界》游戏百科信息系统(源码+论文+部署+安装)
java·vue.js·人工智能·spring boot·游戏·毕业设计·计算机毕业设计
梦想的旅途22 小时前
如何优雅地实现企微外部群消息自动化(Java/Python/Go 多语言版)
java·自动化·企业微信
短剑重铸之日2 小时前
《设计模式》第十篇:三大类型之行为型模式
java·后端·设计模式·责任链模式·访问者模式·行为型模式
应用市场2 小时前
踩坑记录:有符号整数位运算的那些隐蔽Bug——符号扩展、算术右移与补码
java·开发语言·bug
HWL56792 小时前
控制浏览器如何预先加载视频资源
java·服务器·前端
独断万古他化2 小时前
【SSM开发实战:博客系统】(一)项目初始化与基础功能实现
spring boot·spring·mybatis·博客系统·项目