spring boot 自动配置

自动配置介绍

Spring Boot自动装配(Auto Configuration)是Spring Boot框架的一个关键特性,它通过约定大于配置的方式来简化项目的配置过程。自动装配允许开发人员使用默认的配置,同时也可以根据需要进行定制化。Spring通过使用@Autowired注解、@ComponentScan注解以及条件化配置等机制,实现了自动装配的功能。

@Autowired注解: 通过在类的构造方法、成员变量或方法上使用@Autowired注解,Spring容器可以自动满足Bean之间的依赖关系。当容器启动时,它会扫描并识别带有@Autowired注解的地方,并自动装配相应的Bean。

@ComponentScan注解: 使用@ComponentScan注解可以告诉Spring容器在指定的包或类路径下扫描并注册所有标有@Component及其相关注解(如@Service@Repository等)的类作为Bean。这样,开发者无需手动在配置文件中逐个声明每个Bean,而是通过约定大于配置的方式,让Spring自动发现和注册Bean。

条件化配置: Spring Boot通过条件化配置来决定是否需要加载某个配置类或Bean。条件注解(如@ConditionalOnClass@ConditionalOnBean@ConditionalOnProperty等)在配置类上使用,根据一定的条件来判断是否满足加载的条件。

自动配置类: Spring Boot中的自动配置类通常以xxxAutoConfiguration命名的方式,它包含了一系列的Bean定义和配置,根据条件是否满足,自动配置相应的功能。这些类位于spring-boot-autoconfigure模块中。

自动配置的重要注解

  • @EnableAutoConfiguration: 这是Spring Boot自动配置的核心注解。通常在应用的主类上使用该注解,它会启用Spring Boot的自动配置机制。@EnableAutoConfiguration会根据项目的依赖关系和配置自动装配和配置Spring Bean。它通常与@SpringBootApplication一起使用,并启用自动配置机制。通过@EnableAutoConfiguration,Spring Boot会根据项目的依赖自动配置Bean。

  • @Configuration: 该注解表示一个配置类,其中定义了一些Bean的创建和配置。自动配置类通常使用@Configuration注解进行标记。类似于传统的XML配置文件。自动配置类通常会使用@Configuration注解,用于告诉Spring容器这是一个配置类。

  • @AutoConfigureAfter: 该注解指定自动配置类的加载顺序。通过指定其他自动配置类的类名,确保配置类的加载顺序正确。

  • @ConfigurationProperties: 该注解用于绑定配置属性到Java对象。可以在自动配置类及其他组件中使用,将应用程序的配置项映射到对应的属性。

  • @Bean: 用于在配置类中注册Bean。@Bean注解通常与@Configuration一起使用,在方法级别上标记一个方法返回的对象应该被注册为一个Bean。

自动配置实现

自动装配的入口:org.springframework.boot.autoconfigure.AutoConfigurationImportSelector

spring-autoconfigure-metadata.properties:
spring-autoconfigure-metadata.properties 文件存储的是"待自动装配候选类"过滤的计算规则,这个信息很重要,框架会根据里面的规则逐一对候选类进行计算看是否需要被自动装配进容器,并不是全部加载。

spring.factories:

存储了spring-boot所有默认支持的待自动装配候选类,文件通常位于 resources/META-INF 目录下,并且以键值对的形式进行配置。每个键对应一个配置项,值则为对应配置项的实现类。

可以看一下这个博主的分享,非常的详细:

Springboot自动装配之spring-autoconfigure-metadata.properties和spring.factories(SPI机制核心)-CSDN博客

相关推荐
马优晨7 小时前
Spring Boot + MyBatis + Redis 整合实战 —— 项目源码深度解析
spring boot·redis·mybatis·mybatis + redis·redis实战·spring实战·mybatis实战
IKUN家族13 小时前
Spring MVC(一)
java·spring·mvc
老马识途2.014 小时前
关于跨域问题的总结
java·前端
都叫我大帅哥15 小时前
Java日期时间三十年战争:从Date考古到LocalDateTime革命,以及数据库与前端的那点事儿
java
Muscleheng15 小时前
SpringBoot 集成 DeepSeek 实现 RAG 文档问答
java·spring boot·ai·springai
2501_9364156915 小时前
可变参数&综合练习&斗地主游戏
java·windows·游戏
颜酱16 小时前
07 | 把字段与指标同步到 Qdrant(生成阶段)
前端·人工智能·后端
Larcher16 小时前
从“加载模型”界面到端侧推理:拆解一个 React + WebGPU 大模型 Demo
javascript·后端
极客先躯16 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
xqqxqxxq17 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记