Spring Boot初级概念及自动配置原理
初识Spring Boot
SpringBoot的概念
Spring Boot 是基于 Spring 框架的快速开发脚手架,旨在简化 Spring 应用的初始搭建和开发过程。它通过约定优于配置的理念,提供开箱即用的默认设置,让开发者只需关注业务逻辑,减少繁琐的配置。
SpringBoot的核心优势
快速启动
- 内嵌 Tomcat/Jetty 服务器,无需单独部署 WAR 包。
- 通过
main
方法直接运行,秒级启动应用。
自动配置
- 根据项目依赖(如 JDBC、Redis、Web)自动配置组件,无需手动编写 XML 或 Java Config。
起步依赖
- 预置常用依赖包(如
spring-boot-starter-web
包含 Web 开发所需全部依赖),避免版本冲突。
生产就绪特性
- 集成健康检查(
/actuator/health
)、指标监控(Metrics)、外部化配置(如application.properties
)等运维功能。
无代码生成 & 零 XML 配置
- 基于注解和 Java Config 开发,告别传统 XML 配置。
创建你的第一个spring boot项目(快速流程)
创建项目 & 添加依赖
pom.xml:
<!-- Spring Boot 父项目(管理版本) -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.0</version>
</parent><!-- Web 开发起步依赖(内嵌 Tomcat + Spring MVC) -->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication // 核心注解:组合了 @Configuration + @EnableAutoConfiguration + @ComponentScan
public class App {public static void main(String[] args) {SpringApplication.run(MyApp.class, args); // 启动应用}
}
编写控制器
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController // = @Controller + @ResponseBody
public class HelloController {@GetMapping("/hello") // 映射 GET 请求到 /hellopublic String sayHello() {return "Hello, Spring Boot!";}
}
REST 控制器,处理 HTTP 请求,启动项目访问Web到http://localhost:8080/hello
这时有人要问了,那如果我想换端口呢?如果我想给这个应用起个名字方便在日志和监控等地方识别呢?
配置文件(可选)
在resources中创建一个application.properties
自定义配置
server.port=8080 # 修改端口(默认也是8080)
spring.application.name=my-first-boot-app
编写完毕即可参与测试
整个流程为
添加依赖 → 主类注解 → 写Controller → 运行 → 访问接口
无需配置 XML、无需部署服务器,适合快速开发微服务、REST API、后台管理系统等常见场景。
SpringBoot自动配置的原理
那么有人要问了,为什么springboot可以自动配置呢?与python一样,你做的事情越少,底层代码做的事情的越多。
主要场景自动配置核心原理总结
依赖管理机制
版本仲裁
通过 spring-boot-starter-parent
统一管理所有依赖版本,避免冲突:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.0</version> <!-- 此处定义全局版本 -->
</parent>
但是我们仍然能自定义依赖版本,毕竟版本仲裁不一定贴合我们项目本身
自定义版本:在<properties>
中覆盖默认版本
(例: <mysql.version>5.1.6</mysql.version>
)
Starter 预定义依赖集
每个 Starter 封装了特定场景所需的全套依赖(包括依赖的传递)
例如:
-
spring-boot-starter-web
:自动包含 Tomcat + Spring MVC + Jackson -
spring-boot-starter-data-jpa
:自动包含 Hibernate + Spring Data JPA
条件注解驱动自动装配
根据环境条件(类路径、配置属性、Bean 是否存在等)动态决定是否启用自动配置,从而让应用更灵活、轻量。
常用注解如下:
-
@ConditionalOnClass
:类路径存在指定类时生效
(例:存在Servlet.class
才配置 Tomcat) -
@ConditionalOnMissingBean
:容器无该 Bean 时生效
(例:用户未自定义DataSource
才注入默认数据源) -
@ConditionalOnProperty
:配置属性匹配时生效
(例:spring.datasource.url
存在时配置数据源)
应用如下:
@Configuration
@ConditionalOnClass(DataSource.class) // 存在JDBC驱动才生效
public class DataSourceAutoConfiguration {@Bean@ConditionalOnMissingBean // 用户未自定义时生效public DataSource dataSource(DataSourceProperties properties) {return properties.initializeDataSourceBuilder().build();}
}
配置属性绑定
@ConfigurationProperties
绑定
将配置文件属性映射到 Java Bean:
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties {private String url;private String username;// Getter/Setter 省略
}
配置文件示例 (application.properties
):
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
此时配置文件中的属性将映射到JavaBean中
自动配置触发流程(原理)
其核心流程共四步:扫文件 → 读配置 → 筛条件 → 装 Bean
扫描AutoConfiguration.imports
Spring Boot 启动时扫描所有 jar 包的
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
获取所有声明的自动配置类全名(例如 DataSourceAutoConfiguration
)
读取自动配置类
加载并解析这些配置类(例如上面的DataSourceAutoConfiguration
)
应用条件注解筛选
检查每个配置类上的条件注解(上文提到过),只有当前环境满足所有条件的配置类才会生效
例如:,当 classpath 下有 DataSource.class
且容器中没有 DataSource
bean 时,DataSourceAutoConfiguration
才生效(自动配置嘛,配置了就成bean了,有bean就不能配置不然就冲突了)
加载 Bean 并绑定属性
生效的配置类中定义的 @Bean
方法会被执行,创建所需的 Bean 实例。这些 Bean 的属性值(如数据库连接参数)自动从 application.properties/yml
绑定。