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

Spring Boot自动装配原理

Spring Boot自动装配原理:通俗易懂的趣味解析


一、自动装配是什么?——像“智能管家”一样帮你配好一切

想象你刚搬进新家,智能管家会根据你买的家具(比如冰箱、电视),自动帮你布置好电线、网络和摆放位置,不需要你手动操作。Spring Boot的自动装配就是这个“管家”!它通过分析项目的依赖(比如引入spring-boot-starter-web),自动配置好Spring应用所需的组件(如Tomcat服务器、Spring MVC),省去你手动写一堆XML或Java配置的麻烦。


二、自动装配的“钥匙”:@SpringBootApplication注解

在Spring Boot的主启动类上,你会看到@SpringBootApplication。它其实是个“三合一”的快捷方式:

  1. @SpringBootConfiguration:声明这是一个配置类(类似传统Spring的@Configuration)。
  2. @EnableAutoConfiguration:启动自动装配的核心开关!
  3. @ComponentScan:扫描当前包下的Bean(比如@Controller@Service)。
@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}

三、自动装配的底层流程:像侦探一样“找线索”
  1. 找配置清单(spring.factories)
    Spring Boot启动时会扫描所有jar包的META-INF/spring.factories文件,找到所有声明的自动配置类(比如WebMvcAutoConfiguration)。这就像管家有一张清单,记录了所有家具的安装说明书。

  2. 按条件“筛选”配置类
    每个自动配置类都有条件注解,比如:

    • @ConditionalOnClass(某个类):类路径有这个类才生效(比如有Tomcat.class才配Tomcat)。
    • @ConditionalOnMissingBean(某个Bean):用户没自定义这个Bean时,才用默认的。
    • @ConditionalOnProperty(某个配置):根据配置文件(如application.yml)决定是否生效。
  3. 注入Bean到容器
    满足条件的配置类会通过@Bean方法创建组件,并注册到Spring容器中。比如WebMvcAutoConfiguration会自动配好DispatcherServlet(Spring MVC的核心控制器)。


四、举个栗子:引入Web Starter后发生了什么?

假设你引入了spring-boot-starter-web

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

自动装配过程如下:

  1. 依赖触发spring-boot-starter-web包含了Tomcat、Spring MVC等依赖。
  2. 找到配置类spring.factories中声明了WebMvcAutoConfiguration
  3. 条件检查
    • @ConditionalOnClass(DispatcherServlet.class):发现类路径有Spring MVC核心类,继续配置。
    • @ConditionalOnWebApplication:确认这是一个Web应用。
  4. 创建组件:自动配置DispatcherServlet、视图解析器、静态资源处理等。
  5. 用户覆盖:如果你自己写了@Bean DispatcherServlet,自动配置会跳过(因为@ConditionalOnMissingBean)。

五、条件注解的妙用:像“开关”一样灵活
  • 场景1:类路径有Redis依赖时,自动配Redis连接池。

    @Configuration
    @ConditionalOnClass(RedisConnectionFactory.class)
    public class RedisAutoConfiguration {// 自动配置RedisTemplate等
    }
    
  • 场景2:用户没配数据源时,用内存数据库H2。

    @Bean
    @ConditionalOnMissingBean(DataSource.class)
    public DataSource inMemoryDataSource() {return new EmbeddedDatabaseBuilder().build();
    }
    
  • 场景3:通过配置文件开关功能。

    my.feature.enabled: true
    
    @Configuration
    @ConditionalOnProperty(name="my.feature.enabled", havingValue="true")
    public class MyFeatureAutoConfiguration { ... }
    

六、Starter与自动装配的关系:依赖管理的“黄金搭档”
  • Starter的作用:把一组相关依赖(如spring-boot-starter-data-jpa包含JPA、Hibernate)打包,简化依赖管理。
  • 自动配置的触发:引入Starter后,其内部的spring.factories和自动配置类才会被加载。例如,引入spring-boot-starter-data-redis后,自动配置类RedisAutoConfiguration才会生效。

七、总结:自动装配的“灵魂三问”
  1. 如何启动自动装配?
    通过@EnableAutoConfiguration(通常由@SpringBootApplication包含)。

  2. 如何找到配置类?
    扫描所有jar包的META-INF/spring.factories,加载其中声明的自动配置类。

  3. 如何决定是否生效?
    条件注解(如@ConditionalOnClass)根据依赖、配置、环境等因素动态判断。


八、趣味类比:自动装配像“自助餐厅”
  • Starter:你选择的套餐(比如“西餐套餐”)。
  • spring.factories:套餐的食材清单。
  • 条件注解:厨师根据你拿的食材(依赖)决定做哪些菜(Bean)。
  • 配置文件:你可以要求少盐、多辣(覆盖默认配置)。

这样一来,Spring Boot就像一家智能餐厅,你只需选择套餐,剩下的交给厨师(自动装配)搞定!

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

相关文章:

  • QT+opecv如何更改图片的拍摄路径
  • Oracle 慢sql排查
  • 前端面试准备2
  • Axure设计案例——科技感渐变柱状图
  • 24点游戏的最小数字组合问题
  • 常见关系型数据库对比指南
  • 制造业的未来图景:超自动化与劳动力转型的双重革命
  • 数据库中常见的锁机制详解
  • Java设计模式之迭代器模式详解
  • Sigma-Aldrich胰蛋白酶细胞解离方案速览
  • 从零开始的云计算生活——第十四天,困难重重,安全管理。
  • 第4讲、Odoo 18 模块系统源码全解与架构深度剖析【modules】
  • Axure项目实战:驾驶舱(数据一张图)制作教程
  • 【Deepseek 学网络互联】跨节点通信global 和节点内通信CLAN保序
  • 新一代Python管理UV完全使用指南|附实际体验与效果对比
  • Ubuntu系统如何部署Crawlab爬虫管理平台(通过docker部署)
  • STM32 单片机启动过程全解析:从上电到主函数的旅程
  • 数据库 | timescaledb时序表使用注意事项
  • udp 传输实时性测量
  • 【解决办法】ubuntu重启不起来,输入用户名和密码进不去,又重新返回登录页。
  • ubuntu 安装上传的 ffmpeg_7.1.1.orig.tar.xz并使用
  • P20和P15钢材的区别
  • Python中的__init__和__new__方法解析
  • 【java】aes,salt
  • 09_降维、特征提取与流行学习
  • 国产化Word处理控件Spire.Doc教程:通过Java简单快速的将 HTML 转换为 PDF
  • SpringIOC中Bean生命周期
  • Android Studio 2022.2.1.20 汉化教程
  • OBOO鸥柏丨2025年鸿蒙生态+国产操作系统触摸屏查询一体机核心股
  • 【数据分析】Pandas