Spring Boot 自动配置深度解析
主题概述:本文以 Spring Boot 自动配置为核心,系统讲解它的原理与应用示例。
自动配置简介
Spring Boot 的自动配置(Auto-Configuration)能够根据类路径下的依赖和已有的 Bean 定义,智能地为应用加载合适的组件并完成初始化,帮助开发者专注于业务逻辑,减少重复配置。
Spring Boot 两大核心特性
Starter 启动器
Spring Boot 提供多种 Starter POM,如 spring-boot-starter-web
、spring-boot-starter-data-jpa
等,每个启动器预定义了所需依赖和合理的默认配置,开发者只需引入对应 Starter,即可自动获得相关功能。
Auto-Configuration 自动配置
自动配置根据类路径中的 jar 包及容器中现有 Bean,动态地注册和初始化 Bean。例如,当检测到 SqlSessionFactory
类时,自动配置 MyBatis 相关组件;当检测到 DispatcherServlet
时,自动装配 Spring MVC 前端控制器。
自动配置的便捷体验
传统 Spring+MyBatis 配置示例
在未使用 Spring Boot 之前,我们必须手动配置数据源、SqlSessionFactoryBean
、MapperScannerConfigurer
、事务管理器等:
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> ... bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> ... bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> ... bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> ... bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
Spring Boot 简化配置
引入 spring-boot-starter-jdbc
或 -starter-data-jpa
后,仅需在 application.yml
中提供基本数据源信息:
spring
datasource
driver-class-name com.mysql.cj.jdbc.Driver
url jdbc mysql //localhost 3306/springboot
username root
password password
type com.zaxxer.hikari.HikariDataSource
Web 启动器引入后的组件变化
IOC 容器中的 Bean 数量对比
基础环境:未引入任何启动器时,Spring Boot 默认注册 59 个 Bean。
引入
spring-boot-starter-web
:容器中 Bean 总数增至 160 个,其中新增 104 个与 Web 开发相关的组件。
常见 Web 组件简介
dispatcherServlet
:Spring MVC 前端控制器,接收并分发 HTTP 请求。viewResolver
:将逻辑视图名解析为具体视图模板(如 Thymeleaf、Freemarker)。characterEncodingFilter
:统一请求和响应字符编码。mappingJackson2HttpMessageConverter
:JSON 与 Java 对象相互转换。
默认包扫描规则
Spring Boot 默认只扫描主启动类所在包及其子包,可通过:
scanBasePackages = "com.example") (
// 或
"com.example") (
默认配置信息
Spring Boot 为常用功能提供默认配置:
服务器端口:默认
8080
,可在application.properties
中通过server.port
修改。Thymeleaf 模板前缀/后缀:默认
classpath:/templates/
与.html
,可通过spring.thymeleaf.prefix
和spring.thymeleaf.suffix
调整。
按需加载原理
自动配置并非全部生效,而是基于条件注解(@Conditional)按需加载:
条件注解(@Conditional)
@ConditionalOnClass
:仅当指定类在类路径上存在时生效。@ConditionalOnMissingBean
:当容器中不存在指定 Bean 时生效。@ConditionalOnProperty
:仅当配置文件中存在指定属性值时生效。@ConditionalOnWebApplication
:仅在 Web 应用环境下生效。
自动配置实现流程
依赖导入阶段
引入
spring-boot-starter-web
,间接导入spring-boot-starter
和spring-boot-autoconfigure
。spring-boot-autoconfigure
包含 153 个*AutoConfiguration
类。
运行时执行阶段
主启动类上的
@EnableAutoConfiguration
触发AutoConfigurationImportSelector
。加载全部候选自动配置类,应用条件注解进行过滤。
最终只保留与当前场景匹配的自动配置,注册对应组件。
自动配置类示例解析
DispatcherServletAutoConfiguration
proxyBeanMethods = false) (
ServletRegistration.class) (
WebMvcProperties.class) (
protected static class DispatcherServletConfiguration {
name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) (
public DispatcherServlet dispatcherServlet(WebMvcProperties props) { ... }
}
通过 WebMvcProperties
属性类(配置前缀 spring.mvc
)驱动 DispatcherServlet 行为。
EmbeddedWebServerFactoryCustomizerAutoConfiguration
ServerProperties.class) (
public class EmbeddedWebServerFactoryCustomizerAutoConfiguration {
proxyBeanMethods = false) (
Tomcat.class }) ({
public static class TomcatWebServerFactoryCustomizerConfiguration {
public TomcatWebServerFactoryCustomizer tomcatCustomizer(Environment env, ServerProperties props) { ... }
}
}
依赖 ServerProperties
(前缀 server
)配置嵌入式 Web 服务器,如 Tomcat、Jetty。
总结
核心逻辑:引入启动器 → 导入自动配置类 → 启用自动配置 → 条件过滤 → 注册组件 → 基于属性类绑定自定义配置。
开发优势:极大简化依赖和配置,按需加载功能模块,让开发者将精力聚焦在业务实现。
- 微信
- 赶快加我聊天吧
- 赶快加我聊天吧