Spring Boot 是一个基于 Spring Framework 的开源 Java 框架,旨在简化 Spring 应用的初始搭建和开发过程。它通过"约定优于配置"的理念和一系列自动化机制,让开发者能够快速创建独立运行、生产级别的基于 Spring 的应用程序 。
核心特性与优势
| 特性 | 说明 |
|---|---|
| 自动配置 | 根据项目中的类路径(Classpath)和已定义的 Bean,自动配置 Spring 应用。例如,当检测到 spring-boot-starter-web 依赖时,会自动配置内嵌的 Tomcat 和 Spring MVC 。 |
| 起步依赖 | 提供一系列 spring-boot-starter-* 依赖,它们聚合了运行特定类型应用(如 Web、JPA、Security)所需的所有常见依赖,解决了传统 Maven/Gradle 项目中繁琐的依赖管理和版本冲突问题 。 |
| 内嵌 Servlet 容器 | 应用可以打包成一个可执行的 JAR 或 WAR 文件,并内嵌 Tomcat、Jetty 或 Undertow 等 Servlet 容器,无需部署到外部 Web 服务器即可独立运行 。 |
| 生产就绪功能 | 提供一系列用于监控和管理生产环境应用的功能,如健康检查、指标收集、外部化配置等,主要通过 Spring Boot Actuator 模块实现 。 |
| 简化配置 | 支持使用 application.properties 或 application.yml 文件进行集中、灵活的外部化配置,并支持多环境(如 dev, test, prod)配置 。 |
项目结构与核心文件
一个典型的 Spring Boot 项目结构如下:
src/main/java/
└── com/example/demo/
├── DemoApplication.java // 主启动类 ├── controller/ // 控制器层
├── service/ // 业务逻辑层
├── dao/ 或 mapper/ // 数据访问层
└── entity/ 或 model/ // 实体类
src/main/resources/
├── application.yml // 主配置文件 (YAML格式)
├── application.properties // 主配置文件 (Properties格式)
├── static/ // 静态资源 (CSS, JS, images)
└── templates/ // 模板文件 (Thymeleaf, FreeMarker)
pom.xml或 build.gradle // 项目构建文件
1. 主启动类
这是应用的入口点,使用 @SpringBootApplication 注解。
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 核心注解,组合了 @Configuration, @EnableAutoConfiguration, @ComponentScan
public class DemoApplication {
public static void main(String[] args) {
// 启动 Spring Boot 应用 SpringApplication.run(DemoApplication.class, args);
}
}
2. 配置文件
Spring Boot 支持两种格式的全局配置文件,优先级为:application.yml > application.properties 。
application.yml 示例 (YAML格式,推荐使用):
yaml
server:
port: 8081 # 配置服务器端口
servlet:
context-path: /api # 配置应用上下文路径
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb username: root
password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update # JPA 自动更新表结构 show-sql: true # 显示执行的 SQL 语句
logging:
level:
com.example.demo: DEBUG # 设置特定包的日志级别 file:
name: app.log # 配置日志文件输出
application.properties 示例:
properties
server.port=8081
server.servlet.context-path=/api
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
logging.level.com.example.demo=DEBUG
核心注解| 注解 | 作用 |
| :--- | :--- |
| @SpringBootApplication | 标注在主启动类上,是 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan 的组合注解 。 |
| @RestController | 标注在类上,表示该类是一个 RESTful 风格的控制器,其所有方法的返回值默认直接写入 HTTP 响应体(如 JSON/XML)。 |
| @RequestMapping, @GetMapping, @PostMapping 等 | 用于将 HTTP 请求映射到控制器中的处理方法 。 |
| @Autowired | 用于自动注入依赖的 Bean 。 |
| @Configuration | 标注在类上,声明该类是一个配置类,用于替代 XML 配置文件 。 |
| @Value | 用于注入配置文件中的属性值到字段或方法参数中 。 |
自动配置原理
Spring Boot 的自动配置核心是 @EnableAutoConfiguration 注解。其工作流程如下:
1.启动时,Spring Boot 会扫描 META-INF/spring.factories 文件(位于 spring-boot-autoconfigure jar 包中),加载所有预定义的自动配置类(XXXAutoConfiguration)。
-
这些自动配置类使用
@Conditional系列注解(如@ConditionalOnClass,@ConditionalOnMissingBean)进行条件判断。只有当类路径下存在特定的类、配置了特定的属性或没有用户自定义的 Bean 时,对应的自动配置才会生效 。 -
生效的自动配置类会向 Spring 容器中注册一系列配置好的 Bean(如数据源、视图解析器、事务管理器等)。
日志框架集成
Spring Boot 默认使用 SLF4j 作为日志门面,Logback 作为日志实现 。可以通过配置文件轻松调整日志级别和输出格式。
yaml
# application.yml 中的日志配置示例
logging:
level:
root: INFO # 根日志级别
org.springframework.web: DEBUG # Spring Web 相关日志级别
com.example.demo.dao: TRACE # DAO 层详细日志
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" # 控制台输出格式
file:
path: /var/log/myapp # 日志文件路径
与传统 Spring/Spring MVC 项目对比
| 方面 | 传统 Spring MVC 项目 | Spring Boot 项目 |
|---|---|---|
| 项目创建 | 手动搭建,需配置大量 XML 或 Java Config。 | 通过 Spring Initializr 网页或 IDE 插件一键生成,结构标准化 。 |
| 依赖管理 | 需在 pom.xml 中手动添加并协调大量依赖及其版本。 |
使用 spring-boot-starter* 起步依赖,版本由 Spring Boot 统一管理 。 |
| 配置方式 | 需要显式配置 DispatcherServlet、视图解析器、数据源等。 | 自动配置 为主,只需在 application.yml 中按需修改少量属性 。 |
| 部署方式 | 需要打包成 WAR 文件,部署到外部的 Tomcat 等 Servlet 容器。 | 打包成可执行 JAR,内嵌 Servlet 容器 ,通过 java -jar 命令直接运行 。 |
| 应用监控 | 需要额外集成监控工具。 | 内置 Actuator 模块,提供开箱即用的健康检查、指标收集等端点 。 |
快速入门示例:创建一个简单的 REST API
-
创建项目 :使用 Spring Initializr 或 IDE 插件,选择
Spring Web依赖。 -
编写控制器 :
javaimport org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;
@RestController // 声明为 REST 控制器
public class HelloController {
@GetMapping("/hello") // 映射 GET /hello 请求
public String sayHello(@RequestParam(value = "name", defaultValue = "World") String name) {
return "Hello, " + name + "!";
}
}
```
-
运行应用 :直接运行主启动类的
main方法。 -
访问接口 :打开浏览器或使用 curl 访问
http://localhost:8080/hello?name=SpringBoot,将得到响应Hello, SpringBoot!。