Spring Boot——Spring Boot自动配置原理

简介: Spring Boot——Spring Boot自动配置原理

系列文章目录

Spring Boot启动原理

Spring Boot自动配置原理

前言

一直在使用Spring Boot特别好奇的是为什么Spring Boot比Spring在项目构建和开发过程中要方便很多,无需编写大量的配置,Spring Boot自动给你配置好了。往往是集成项目依赖之后一键使用。于是小编我就学习和研究了一下Spring Boot的自动配置。

一、Spring Boot自动配置原理剖析

主程序入口示例

@SpringBootApplication
public class SampleWebJspApplication extends SpringBootServletInitializer {
  public static void main(String[] args) {
    SpringApplication.run(SampleWebJspApplication.class, args);
  }
}

我们可以发现在Spring Boot项目的启动类上有一个@SpringBootApplication,而这个注解与Spring Boot的自动装配有关系。我进入这个注解可以发现:

通过上面的图片我们可以看出,@SpringBootApplication又是主要由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这三个注解组成。


@SpringBootConfiguration表示这是一个 Spring Boot 应用程序的配置类。

@ComponentScan用于配置 Spring 的组件扫描。它会告诉 Spring 在指定的包下扫描组件,并将它们注册为 Spring 的 Bean。


重点是这个@EnableAutoConfiguration注解:

而**@EnableAutoConfiguration**的含义就是开启自动配置。该注解启用了 Spring Boot 的自动配置机制,它告诉 Spring Boot 根据项目的依赖和类路径中的配置来自动配置应用程序。


我们再进入到@EnableAutoConfiguration注解中,我们可以看到:


a0f78e84e60f49318912ee9a33e158be.png


我上面图片中我们可以看出,@EnableAutoConfiguration主要由@AutoConfigurationPackage、@Import这两个注解组成。


@AutoConfigurationPackage被应用在 Spring Boot 主配置类上时,它会扫描该主配置类所在的包及其子包,并将其作为自动配置的起始位置。之前的@SpringBootConfiguration标注了主配置类。最终作用在了SampleWebJspApplication类上,也就是启动类上。


其中最为关键的是**@Import这个注解,@Import 的参数会指定一系列自动配置类的类名,这些类会被导入到 Spring Boot 应用的上下文中。细节上是:

其导入的AutoConfigurationImportSelector类的selectImports()**方法中最终通过

**SpringFactoriesLoader.loadFactoryNames()**方法从类路径下的META-INF/spring.factories中获取key键为EnableAutoConfiguration类的全类名对应的value值,value值是一个xxxAutoConfiguration的全类名的列表。


如图:

b6d3a3c580cb451a8db9b419c13a7552.png

拿到这些自动配置类的全类名的列表之后,然后会将其加载到Spring容器中,当然判断我们项目中引入了那些启动器


例如引入了spring-boot-starter-web那么就会将org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration

org.springframework.boot.autoconfigure.web.embedded.EmbeddedServletContainerAutoConfiguration

org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

等等…加载到Spring容器中。


补充什么是启动器:启动器也叫起步依赖,起步依赖是一组预定义的依赖项,他们封装了对特定功能集所需的所有依赖和配置,让开发者能够更快得集成常见功能,而无需手动添加每一个依赖。

起步依赖的命名遵循一定的规则,通常以spring-boot-starter为前缀,后面跟着起步依赖的类型或用途。

如:

spring-boot-starter-web:用于开发web应用程序的起步依赖,包含了Web相关的依赖和配置,如Tomact、Spring Web MVC等

spring-boot-starter-data-jpa:用于与JPA集成的起步依赖,包含了JPA、Hibernate等依赖。


二、自动配置生效

每一个XxxxAutoConfiguration自动配置类,在某些条件下才会生效。这些条件在Spring Boot中以注解的形式体现。

这些条件注解主要位于org.springframework.boot.autoconfigure.condition 包下。

常见的条件注解有:


@ConditionalOnClass:

当类路径中存在指定的类时,自动配置类才会生效

@ConditionalOnMissingClass:

当类路径中不存在指定的类时,自动配置类才会生效。

@ConditionalOnBean:

当 Spring 容器中存在指定的 Bean 时,自动配置类才会生效。

@ConditionalOnMissingBean:

当 Spring 容器中不存在指定的 Bean 时,自动配置类才会生效。

@ConditionalOnProperty:

当指定的配置属性存在且为指定的值时,自动配置类才会生效。

@ConditionalOnWebApplication:

当应用是一个 Web 应用程序时,自动配置类才会生效。

@ConditionalOnNotWebApplication:

当应用不是一个 Web 应用程序时,自动配置类才会生效。

这些条件注解可以很灵活地根据不同的条件来决定是否启用自动配置类,从而实现按需加载配置,避免了配置的冗余和不必要的加载。


补充:对于具体的Spring Boot启动流程,可以浏览下面的文章:Spring Boot——Spring Boot启动原理


三、总结:

在 Spring Boot 应用程序启动过程中会通过@EnableAutoConfiguration 注解找到 META-INF/spring.factories 配置文件中的所有自动配置类,并将它们加载到应用程序上下文中,以实现自动配置的功能。


**通过这一次对Spring Boot自动配置的探究让我清晰了为什么Spring Boot能引入启动依赖(starter)之后不需要手动配置了。**对于Spring Boot的了解也更近了一步。


目录
相关文章
|
2天前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
14 1
|
1天前
|
Java 开发者 Spring
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【5月更文挑战第16天】在Spring Boot中,@RequiredArgsConstructor 和 @Lazy 是两个有用的注解,它们分别用于简化构造函数的生成和控制Bean的加载时间。下面详细解析这两个注解的概念、优缺点以及在实际应用中的示例。
4 1
|
2天前
|
XML Java 开发者
springboot 启动原理、启动过程、启动机制的介绍
【5月更文挑战第13天】Spring Boot 是一种基于 Java 的框架,用于创建独立的、生产级别的 Spring 应用程序。它的主要目标是简化 Spring 应用的初始搭建和开发过程,同时提供一系列大型项目常见的非功能性特征(如嵌入式服务器、安全性、度量、健康检查和外部化配置)。
18 3
|
2天前
|
XML Java 数据格式
Spring高手之路18——从XML配置角度理解Spring AOP
本文是全面解析面向切面编程的实践指南。通过深入讲解切面、连接点、通知等关键概念,以及通过XML配置实现Spring AOP的步骤。
22 6
Spring高手之路18——从XML配置角度理解Spring AOP
|
2天前
|
移动开发 前端开发 NoSQL
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
49 0
|
2天前
|
消息中间件 开发框架 Java
什么是Spring Boot 自动配置?
Spring Boot 是一个流行的 Java 开发框架,它提供了许多便利的功能和工具,帮助开发者快速构建应用程序。其中一个最引人注目的特性是其强大的自动配置功能。
9 0
|
2天前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
18 0
|
2天前
|
XML Java 数据库连接
Spring框架与Spring Boot的区别和联系
Spring框架与Spring Boot的区别和联系
23 0
|
2天前
|
Java Spring
Spring文件配置以及获取
Spring文件配置以及获取
13 0
|
2天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
36 6