本文主要是介绍揭秘SpringBoot自动装配原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
一、自动装配
二、SpringBoot核心注解
2.1 @SpringBootApplication
2.2 @Conditional*条件注解
三、spring.factories 文件
四、自动装配流程
一、自动装配
SpringBoot 自动装配是 SpringBoot 框架中一项核心特性,它极大地简化了 Spring 应用的开发过程,使得开发者能够快速搭建和运行一个独立的、生产级别的应用程序,几乎无需手动配置。
自动装配式 SpringBoot 为了实现"约定大于配置"理念而设计的机制,其核心目标是基于项目中添加的依赖自动配置 Spring 应用上下文,减少或消除传统 Spring 应用中繁琐的 XML 或 Java 配置。
二、SpringBoot核心注解
SpringBoot 能够实现自动装配主要是通过一些列注解实现,下面介绍下其核心注解,只有了解了这些注解才能深入理解 SpringBoot 自动装配的原理
2.1 @SpringBootApplication
这是 SpringBoot 应用的起点,实际上是一个组合注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}
包含了以下三个核心注解:
- @SpringBootConfiguration:标记这个类为一个配置类,其实就是 @Configuration 注解的派生注解,用于声明配置类,其中可以定义 Bean。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}
- @EnableAutoConfguration:启用自动配置功能,告诉 SpringBoot 根据项目依赖自动配置应用程序上下文。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
此注解是自动配置的核心,通过它 SpringBoot 会根据项目中引入的依赖来决定需要激活哪些自动配置类。有两个需要注意的地方,那就是 @AutoConfigurationPackage、@Import(AutoConfigurationImportSelector.class),先来看下 @AutoConfigurationPackage。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
这个注解告诉 SpringBoot 应该从哪个包开始进行自动配置类扫描。默认情况下,它会扫描启动类所在包及其子包。虽然 @SpringBootApplication
已经隐含了 @ComponentScan
来扫描组件,但 @AutoConfigurationPackage
更专注于自动配置的类。它确保了 SpringBoot 的自动配置机制能够找到并正确配置那些根据项目依赖和环境自动生成的配置类。
需要注意的是,@AutoConfigurationPackage 并不直接参与组件扫描工作,它的主要职责是确定自动配置的起点,而不是像 @ComponentScan 注解直接查找带有 @Service
、@Repository
、@Controller
等注解的类。
再来看下 @Import(AutoConfigurationImportSelector.class) 注解,AutoConfigurationImportSelector 是 Spring Boot 框架中的一个核心类,它负责自动配置类的导入选择过程,是实现 Spring Boot 自动配置机制的关键组件。
@ComponentScan:
用于自动扫描并注册Bean。如果不指定扫描范围,默认会扫描包含@ComponentScan
注解的类所在的包及其子包。可以通过basePackages
属性自定义扫描的包路径。
2.2 @Conditional*条件注解
这些注解用于条件化地配置 Bean,只有当指定的条件满足时,对应的配置才会生效。
@ConditionalOnClass
:只有当类路径下存在指定的类时,才加载配置。@ConditionalOnMissingBean
:只有当容器中不存在某个类型的Bean时,才创建指定的Bean。@ConditionalOnProperty
:根据配置文件中的属性值决定是否应用配置。
三、spring.factories 文件
spring.factories
是 SpringBoot 框架用于自动配置和扩展点的一份重要配置文件,位于META-INF/spring.factories
目录下。这个文件是一个简单的文本文件,用于声明哪些类是特定接口或注解的实现或候选者。它在Spring Boot的自动配置机制中扮演着至关重要的角色,通过它,Spring Boot能够自动发现并加载许多默认的配置和扩展点。
文件内容如下:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration// 省略....
四、自动装配流程
Springboot自动装配流程大体概括如下:
- 启动类检测:Spring Boot应用的启动类上通常会有
@SpringBootApplication
注解,它是一个组合注解,包含@EnableAutoConfiguration
。 - 自动配置:
@EnableAutoConfiguration
会开启自动配置功能,Spring Boot会自动根据类路径下的jar包依赖为项目进行默认配置。 - 选择器机制:Spring Boot内部有一个
AutoConfigurationImportSelector
类,它会扫描所有META-INF/spring.factories
文件,并根据文件中配置的条件进行过滤,选择合适的自动配置类。 - 配置类实例化:选择合适的自动配置类后,它们会被实例化并注册到Spring容器中。
- 属性配置:Spring Boot的自动配置还依赖于
application.properties
或application.yml
文件中的配置,这些配置会影响到自动配置的最终行为。 - 条件注解:Spring Boot的自动配置类中通常会使用
@ConditionalOnClass
、@ConditionalOnMissingBean
等注解来控制配置的触发条件。
往期经典推荐:
Sentinel与Nacos强强联合,构建微服务稳定性基石的重要实践_nacos和sentinel的关系-CSDN博客
SpringBoot开箱即用魔法:深度解析与实践自定义Starter-CSDN博客
从0开始理解DevOps-CSDN博客
TiDB高手进阶:揭秘自增ID热点现象与高级调优技巧_tidb 分布式自增id-CSDN博客
深入浅出 Kafka 消费者:解密分布式消息流的幕后英雄_kafka消费-CSDN博客
这篇关于揭秘SpringBoot自动装配原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!