Spring Boot 自动配置深度解析

Spring Boot 自动配置深度解析

主题概述:本文以 Spring Boot 自动配置为核心,系统讲解它的原理与应用示例。


自动配置简介

Spring Boot 的自动配置(Auto-Configuration)能够根据类路径下的依赖和已有的 Bean 定义,智能地为应用加载合适的组件并完成初始化,帮助开发者专注于业务逻辑,减少重复配置。

Spring Boot 两大核心特性

Starter 启动器

Spring Boot 提供多种 Starter POM,如 spring-boot-starter-webspring-boot-starter-data-jpa 等,每个启动器预定义了所需依赖和合理的默认配置,开发者只需引入对应 Starter,即可自动获得相关功能。

Auto-Configuration 自动配置

自动配置根据类路径中的 jar 包及容器中现有 Bean,动态地注册和初始化 Bean。例如,当检测到 SqlSessionFactory 类时,自动配置 MyBatis 相关组件;当检测到 DispatcherServlet 时,自动装配 Spring MVC 前端控制器。

自动配置的便捷体验

传统 Spring+MyBatis 配置示例

在未使用 Spring Boot 之前,我们必须手动配置数据源、SqlSessionFactoryBeanMapperScannerConfigurer、事务管理器等:

<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 默认只扫描主启动类所在包及其子包,可通过:

@SpringBootApplication(scanBasePackages = "com.example")
// 或
@ComponentScan("com.example")

默认配置信息

Spring Boot 为常用功能提供默认配置:

  • 服务器端口:默认 8080,可在 application.properties 中通过 server.port 修改。

  • Thymeleaf 模板前缀/后缀:默认 classpath:/templates/.html,可通过 spring.thymeleaf.prefixspring.thymeleaf.suffix 调整。

按需加载原理

自动配置并非全部生效,而是基于条件注解(@Conditional)按需加载:

条件注解(@Conditional)

  • @ConditionalOnClass:仅当指定类在类路径上存在时生效。

  • @ConditionalOnMissingBean:当容器中不存在指定 Bean 时生效。

  • @ConditionalOnProperty:仅当配置文件中存在指定属性值时生效。

  • @ConditionalOnWebApplication:仅在 Web 应用环境下生效。

自动配置实现流程

依赖导入阶段

  1. 引入 spring-boot-starter-web,间接导入 spring-boot-starterspring-boot-autoconfigure

  2. spring-boot-autoconfigure 包含 153 个 *AutoConfiguration 类。

运行时执行阶段

  1. 主启动类上的 @EnableAutoConfiguration 触发 AutoConfigurationImportSelector

  2. 加载全部候选自动配置类,应用条件注解进行过滤。

  3. 最终只保留与当前场景匹配的自动配置,注册对应组件。

自动配置类示例解析

DispatcherServletAutoConfiguration

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ServletRegistration.class)
@EnableConfigurationProperties(WebMvcProperties.class)
protected static class DispatcherServletConfiguration {
   @Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
   public DispatcherServlet dispatcherServlet(WebMvcProperties props) { ... }
}

通过 WebMvcProperties 属性类(配置前缀 spring.mvc)驱动 DispatcherServlet 行为。

EmbeddedWebServerFactoryCustomizerAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication
@EnableConfigurationProperties(ServerProperties.class)
public class EmbeddedWebServerFactoryCustomizerAutoConfiguration {
   @Configuration(proxyBeanMethods = false)
   @ConditionalOnClass({ Tomcat.class })
   public static class TomcatWebServerFactoryCustomizerConfiguration {
       @Bean
       public TomcatWebServerFactoryCustomizer tomcatCustomizer(Environment env, ServerProperties props) { ... }
  }
}

依赖 ServerProperties(前缀 server)配置嵌入式 Web 服务器,如 Tomcat、Jetty。

总结

  • 核心逻辑:引入启动器 → 导入自动配置类 → 启用自动配置 → 条件过滤 → 注册组件 → 基于属性类绑定自定义配置。

  • 开发优势:极大简化依赖和配置,按需加载功能模块,让开发者将精力聚焦在业务实现。

  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录