一文彻底弄懂spring boot自动转配的过程
Spring Boot 的自动配置机制是它的重要特性之一,极大地简化了 Spring 应用的配置工作。自动配置的核心思想是基于类路径中的依赖、环境配置以及自定义代码进行智能化配置,避免了开发者手动编写大量的样板代码。
接下来,我将详细介绍 Spring Boot 自动配置的过程,核心原理以及涉及的关键组件,并结合源码进行深入解析。
一、Spring Boot 自动配置的工作流程
@SpringBootApplication注解
自动配置的起点通常是@SpringBootApplication注解,它是一个组合注解,包含了三个重要注解:@SpringBootConfiguration:标记为一个 Spring 配置类,类似于@Configuration。@EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。@ComponentScan:扫描当前包及其子包下的所有 Spring 组件。
其中
@EnableAutoConfiguration是自动配置的核心,它引导自动配置机制。@EnableAutoConfiguration和AutoConfigurationImportSelector
@EnableAutoConfiguration注解的作用是告诉 Spring Boot 启动时自动配置 Spring 应用上下文。该注解引入了AutoConfigurationImportSelector,这是自动配置的核心处理器。@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
AutoConfigurationImportSelector类会从配置文件中(通常是spring.factories)读取所有的自动配置类,并将它们导入到应用上下文中。spring.factories文件
自动配置类是通过spring-boot-autoconfigure模块的META-INF/spring.factories文件来配置的。这个文件中列出了所有可以被自动加载的配置类:org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
...
这些配置类会在 Spring Boot 启动时根据当前环境条件被选择性加载。
条件装配(
@Conditional系列注解)
Spring Boot 并不是盲目地加载所有的自动配置类。每个自动配置类通常都会使用@Conditional系列注解来进行有条件的加载。最常见的条件注解有:@ConditionalOnClass:当类路径中存在某个类时才生效。@ConditionalOnMissingBean:当 Spring 上下文中不存在某个 Bean 时才生效。@ConditionalOnProperty:当某个配置属性满足特定条件时才生效。@ConditionalOnBean:当 Spring 上下文中存在某个 Bean 时才生效。
例如,
DataSourceAutoConfiguration只有在项目中存在数据源相关的依赖(如javax.sql.DataSource类)时才会被加载。自动配置类示例:
DataSourceAutoConfigurationSpring Boot 中
DataSourceAutoConfiguration是配置数据源的自动配置类,它的源码如下:@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({DataSourcePoolMetadataProvidersConfiguration.class,
DataSourceInitializationConfiguration.class})
public class DataSourceAutoConfiguration { @Bean
@ConditionalOnMissingBean
public DataSource dataSource(DataSourceProperties properties) {
// 创建并返回 DataSource 对象
return properties.initializeDataSourceBuilder().build();
}
}
@ConditionalOnClass(DataSource.class):只有当类路径下存在DataSource类时,才进行数据源的自动配置。@ConditionalOnMissingBean:如果 Spring 上下文中没有其他DataSourceBean,则自动配置一个。
这种基于条件的配置方式确保了 Spring Boot 的灵活性,允许用户通过覆盖默认 Bean 或不满足条件的方式跳过某些自动配置。
二、Spring Boot 自动配置的核心步骤
- 收集自动配置类
启动时,AutoConfigurationImportSelector从spring.factories文件中读取所有的自动配置类,并通过@Import导入这些类。 - 条件检查
自动配置类的加载不是无条件的,Spring Boot 会根据@Conditional注解进行条件检查,确保只有符合条件的自动配置类才会生效。 - 注入所需的 Bean
一旦自动配置类通过条件检查,Spring Boot 就会根据这些配置类注册所需的 Bean。例如,DataSourceAutoConfiguration会自动配置数据源相关的 Bean。 - 允许用户覆盖自动配置
自动配置并不是强制的。用户可以通过显式声明自己的 Bean 来覆盖自动配置的默认行为。例如,如果用户在自己的配置类中定义了DataSource,那么 Spring Boot 就不会再自动配置数据源。
三、Spring Boot 自动配置的实际案例
Web 应用自动配置
在 Spring Boot Web 应用中,DispatcherServletAutoConfiguration负责自动配置 Spring MVC 的核心组件,例如DispatcherServlet、RequestMappingHandlerMapping等。- 如果项目中存在
spring-web依赖,那么DispatcherServletAutoConfiguration会自动加载。 - 如果没有手动定义
DispatcherServlet,Spring Boot 会自动创建一个DispatcherServlet并配置到 Spring 容器中。
- 如果项目中存在
数据库连接池自动配置
Spring Boot 还会自动配置数据库连接池(如 HikariCP、Tomcat JDBC 等),这依赖于项目中的spring-boot-starter-data-jpa或者spring-boot-starter-jdbc依赖。DataSourceAutoConfiguration和DataSourceProperties共同负责自动配置数据源。- 如果类路径中存在连接池类(如
HikariDataSource),那么 Spring Boot 就会自动配置连接池。
同时,用户可以通过
application.properties文件来自定义连接池配置:spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.datasource.hikari.maximum-pool-size=10
Spring Security 自动配置
当引入spring-boot-starter-security依赖时,Spring Boot 会自动配置安全机制,默认提供 HTTP Basic 认证机制。SecurityAutoConfiguration负责自动配置 Spring Security 的基础设施。- 如果需要定制安全策略,可以通过自定义
WebSecurityConfigurerAdapter来覆盖默认配置。
四、Spring Boot 自动配置的好处
- 极大地简化配置工作:开发者不再需要为每个基础设施组件编写配置代码,自动配置机制根据项目依赖自动注入所需的 Bean。
- 灵活性:自动配置并不会束缚开发者。开发者可以通过自定义配置轻松覆盖默认的自动配置。
- 约定优于配置:Spring Boot 遵循 "约定优于配置" 的原则,只需少量的配置,Spring Boot 就能完成复杂的初始化工作。
五、Spring Boot 自动配置与 Spring 自动装配的区别
- Spring 自动装配:指通过
@Autowired等注解,根据类型自动注入依赖 Bean。它侧重于注入已经配置好的 Bean。 - Spring Boot 自动配置:是根据类路径中的依赖和环境信息自动配置 Spring 组件的过程。它负责创建并配置所需的基础设施 Bean。
总结来说,Spring Boot 的自动配置机制通过 @EnableAutoConfiguration 启动,基于 spring.factories 中的配置和 @Conditional 条件判断,自动注入所需的 Bean,简化了开发者的配置工作,同时保留了灵活的定制能力。
一文彻底弄懂spring boot自动转配的过程的更多相关文章
- Spring Boot自动配置原理懂后轻松写一个自己的starter
目前很多Spring项目的开发都会直接用到Spring Boot.因为Spring原生开发需要加太多的配置,而使用Spring Boot开发很容易上手,只需遵循Spring Boot开发的约定就行了, ...
- Spring Boot自动配置原理(转)
第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot- ...
- Spring Boot自动装配
前言 一些朋友问我怎么读源码,这篇文章结合我看源码时候一些思路给大家聊聊,我主要从这三个方向出发: 确定目标,这个目标要是一个具体,不要一上来我要看懂Spring,这是不可能的,目标要这么来定,比如看 ...
- Spring Boot 自动装配流程
Spring Boot 自动装配流程 本文以 mybatis-spring-boot-starter 为例简单分析 Spring Boot 的自动装配流程. Spring Boot 发现自动配置类 这 ...
- Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...
- Springboot 系列(三)Spring Boot 自动配置原理
注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring ...
- Spring Boot自动配置与Spring 条件化配置
SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...
- Spring Boot自动配置原理、实战
Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...
- Spring Boot自动配置
Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...
- Spring boot 自动配置自定义配置文件
示例如下: 1. 新建 Maven 项目 properties 2. pom.xml <project xmlns="http://maven.apache.org/POM/4 ...
随机推荐
- JUC高并发编程(三)之模拟接口压力测试
1.背景 接口压力测试是产品上线前很重要的一项测试,我们可以使用很多开源工具测试, 当然我们也可以简单的写一个多线程并发测试案例 2.代码 controller接口 /** * 查询订单 * * @r ...
- 官网使用conda&pip安装PyTorch命令总结(包含各版本)
原网页https://pytorch.org/get-started/previous-versions/ 因为有时访问该网站比较慢,所以本博客记录该网页内容 Installing previous ...
- CSS学习(一)CSS和文档
应用样式的三种方式 外部样式表(link.@import) 嵌入式样式表(<style></style>) 行内样式 (html元素的属性为style的值作为样式) CSS的空 ...
- Ubuntu 安装 Docker Desktop
介绍 Docker 有两种版本:Docker Desktop 和 Docker Engine (也称作 Docker CE).Docker Desktop 是带图形界面的版本,非常适合需要在桌面环境中 ...
- How to set keyboard for xshell 8 beta? 快捷键设置
今天发现xshell8 不能使用Ctrl + v,就找了一下攻略,发现版本不对,都是低版本的,针对还处于测试期间的xshell 8,没有攻略. 那就自己摸索吧,看了几眼,发现:xshell 8 挪位置 ...
- Error:java: JDK isn't specified for module
报错: Error:java: JDK isn't specified for module 背景: 删除原项目文件夹内所有文件,copy的新的配置文件与src文件夹等,期间打开该项目的IDEA一直处 ...
- mvn install 设定下载的依赖保存的地址
mvn clean install -P jdk-1.8 -Dmaven.repo.local=/xxxx/repository
- ASP.NET Core – View Component
前言 以前写过 Asp.net core 学习笔记 ( ViewComponent 组件 ), 这篇作为翻新版. 参考 Docs – View components in ASP.NET Core D ...
- 全网最适合入门的面向对象编程教程:48 Python函数方法与接口-位置参数、默认参数、可变参数和关键字参数
全网最适合入门的面向对象编程教程:48 Python 函数方法与接口-位置参数.默认参数.可变参数和关键字参数 摘要: 在 Python 中,函数可以接受多种不同类型的参数,包括位置参数.默认参数.可 ...
- windbg配置问题汇总(记录)
.loadby sos.dll mscorwks.symfix c:\windows\symbols windbg配置问题汇总 1.Failed to find runtime DLL (clr.dl ...