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博客

相关推荐
会编程的吕洞宾25 分钟前
DeepAgents In Action学习(Second)
android·java·学习
梦梦代码精37 分钟前
基于UniApp+Vue3+ThinkPHP 8,这套知识付费系统的架构设计有点东西
java·低代码·docker·uni-app·开源·php
雨落倾城夏未凉1 小时前
halcon核心-C# 联合编程(十一)
后端
-凌凌漆-1 小时前
【freertos】Task创建(v2)
java·开发语言·算法
牛油果子哥q1 小时前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++
元界metalite2 小时前
SpringBoot整合Druid-连接池参数为什么不能照抄
后端
fatcoder2 小时前
玩转Nginx 09 — 运维排障:三场"火灾"实战演练
前端·后端·nginx
元界metalite2 小时前
MyBatis通用查询如何避免SELECT *?MetaLite如何按需返回字段
后端
Flynt2 小时前
Go 1.27 升了一波,泛型方法和 JSON v2 真香但有个坑
后端·go
我会冲击波3 小时前
vibe coding 一个多月,我把 Claude Code + Pi 做成了桌面 IDE,还给它移植了 VS Code 的编辑体验
前端·javascript·后端