一、Spring Boot 概述
1.1 定义
Spring Boot 是基于 Spring 框架的快速开发框架,旨在简化 Spring 应用的初始搭建及开发过程。它通过「约定优于配置」的理念,自动配置大部分开发场景下的通用设置,让开发者聚焦业务逻辑而非基础设施配置。例如,以往使用 Spring 框架开发项目时,需要手动配置大量的 XML 文件和依赖,而 Spring Boot 则可以通过自动配置和起步依赖,快速集成常用的第三方框架,减少开发者的配置工作量。
1.2 核心优势
- 快速启动:通过 Starter 一键集成依赖,无需手动编写大量 XML 或繁琐配置。例如,引入
spring-boot-starter-web
依赖,就可以快速整合 SpringMVC 框架,同时通过 Maven 继承的方式引用到 Spring - aop、Spring - beans、Spring - core、Spring - web 等相关依赖。 - 内嵌容器:内置 Tomcat、Jetty 等 Servlet 容器,可直接运行 JAR 包,无需手动部署。这使得 Web 应用程序的部署变得简单,开发者可以将应用打包成一个独立的 JAR 文件,直接通过
java - jar
命令运行。 - 生产级特性:内置 Actuator 监控、健康检查、安全管理等功能,开箱即用。Actuator 可以提供应用的运行时信息,如健康状态、指标监控、日志信息等,方便开发者在生产环境中对应用进行监控和管理。
- 微服务友好:与 Spring Cloud 无缝整合,支持服务注册、配置中心、链路追踪等微服务场景。Spring Boot 为微服务架构提供了良好的支持,使得开发者可以快速构建和部署微服务应用。
二、Spring Boot 核心概念与架构
2.1 自动配置(Auto - configuration)
Spring Boot 通过 @EnableAutoConfiguration
注解实现自动配置,核心原理如下:
- 类路径扫描:检测项目中引入的依赖(如
spring - boot - starter - web
),触发对应的自动配置类(如WebMvcAutoConfiguration
)。例如,当项目中引入了spring - boot - starter - web
依赖时,Spring Boot 会自动配置 SpringMVC 框架和嵌入式 Tomcat 服务器。 - 条件注解过滤:通过
@ConditionalOnClass
(存在某个类时生效)、@ConditionalOnMissingBean
(无自定义 Bean 时生效)等注解动态控制配置的加载。例如,如果开发者自己定义了一个WebMvcConfigurationSupport
的类,那么 Spring Boot 的默认 Web 配置就会失效。 - 属性绑定:通过
@ConfigurationProperties
将application.properties
/application.yml
中的配置注入到 Bean 中。例如,在application.yml
中配置了数据库连接信息,通过@ConfigurationProperties
注解可以将这些配置信息绑定到对应的 Java Bean 中。
2.2 Starter 依赖机制
Starter 是 Spring Boot 封装依赖的核心模块,命名规范为 spring - boot - starter - *
,作用是将相关依赖聚合为单一模块,简化依赖管理。
- 核心 Starter 示例:
spring - boot - starter - web
:包含 Spring MVC、Tomcat、JSON 解析等 Web 开发必需依赖。spring - boot - starter - data - jpa
:整合 Hibernate、Spring Data JPA,简化数据库操作。spring - boot - starter - security
:集成 Spring Security,快速实现认证授权。
- 使用方式:在
pom.xml
中引入 Starter,Spring Boot 自动处理依赖版本和传递性依赖。例如,在pom.xml
中添加spring - boot - starter - web
依赖,Spring Boot 会自动引入 SpringMVC、Tomcat 等相关依赖,并且处理好它们之间的版本兼容性问题。
三、Spring Boot 快速入门
3.1 开发环境准备
- JDK:建议使用 Java 17 +(Spring Boot 3.x 最低要求)。
- IDE:IntelliJ IDEA(推荐)或 Eclipse,安装 Spring Boot 插件。
- 构建工具:Maven 3.6 + 或 Gradle 7 +。
3.2 创建第一个 Spring Boot 项目
- 方式一:通过 Spring Initializr 网页端:访问
start.spring.io
,选择 Group(如com.example
)、Artifact(如demo
)、Java 版本(17)、依赖(如 Web),下载生成的 ZIP 包,解压后导入 IDE。 - 方式二:IDE 内置模板:在 IntelliJ IDEA 中选择
File > New > Project > Spring Boot
,按向导配置项目信息。
3.3 项目结构解析
一个典型的 Spring Boot 项目结构如下:
demo /
├─ src /
│ ├─ main /
│ │ ├─ java /
│ │ │ └─ com /
│ │ │ └─ example /
│ │ │ │ └─ demo /
│ │ │ │ │ ├─ controller / # 控制器层(处理 HTTP 请求)
│ │ │ │ │ ├─ service / # 业务逻辑层
│ │ │ │ │ └─ repository / # 数据访问层(如 Spring Data JPA 接口)
│ │ │ ├─ DemoApplication.java # 启动类(含 @SpringBootApplication 注解)
│ │ ├─ resources /
│ │ │ ├─ application.properties # 主配置文件(也可用 application.yml)
│ │ │ ├─ static / # 静态资源(CSS、JS、图片等)
│ │ │ └─ templates / # 模板文件(如 Thymeleaf 页面)
└─ pom.xml # Maven 依赖配置文件
3.4 编写第一个 RESTful API
以下是一个简单的 RESTful API 示例:
@RestController
@RequestMapping("/api/hello")
public class HelloController {
@GetMapping
public String hello() {
return "Hello, Spring Boot!";
}
}
在上述代码中,@RestController
注解表示这是一个 RESTful 风格的控制器,@RequestMapping
注解指定了请求的路径,@GetMapping
注解表示处理 GET 请求。
四、Spring Boot 常用注解
4.1 @SpringBootApplication
通常加到启动类上,被标注的类可以定义一个或多个 Bean,并自动触发自动配置 Bean 和自动扫描组件,可看作是 @Configuration
、@EnableAutoConfiguration
、@ComponentScan
注解的集合。例如:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
4.2 @RestController
和 @RequestMapping
@RestController
注解继承自@Controller
注解,用于标识一个 RESTful Web 服务的控制器,返回的是数据,而不是视图。@RequestMapping
方法级别的映射注解,用于将 HTTP 请求映射到控制器的处理方法上。例如:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUser(id);
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
}
4.3 @EnableAutoConfiguration
该注解告诉 Spring Boot 根据添加的 jar 依赖猜测你想如何配置 Spring。如果发现应用了你不想要的特定自动配置类,可以使用该注解的排除属性来禁用它们。例如:
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class MyConfiguration { }
4.4 @Configuration
Spring Boot 提倡基于 Java 的配置,@Configuration
注解该类,等价于 XML 中配置 beans;用 @Bean
标注方法等价于 XML 中配置 bean。例如:
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
}
4.5 @Autowired
和 @Resource
@Autowired
:按类类型,自动导入依赖的 bean 对象。@Resource
:按类名称,自动导入依赖的 bean 对象。例如:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository; // 业务逻辑方法
}
五、Spring Boot 配置管理
5.1 配置文件
Spring Boot 支持多种配置文件格式,如 application.properties
、application.yml
、application.xml
、application.json
等。默认的配置文件名是 application.properties
,也可以使用 YAML 格式的 application.yml
或 application.yaml
进行配置。例如,在 application.yml
中配置服务器端口和数据库连接信息:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
5.2 配置绑定
可以使用 @ConfigurationProperties
注解将配置文件中的属性绑定到 Java Bean 中。例如:
@Component
@ConfigurationProperties(prefix = "server")
public class ServerProperties {
private Integer port;
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
}
5.3 配置加载顺序
Spring Boot 的配置加载遵循一定的规则和优先级顺序,以确保开发者能够灵活地覆盖默认设置或提供环境特定的配置。一般顺序(从低优先级到高优先级)如下:
- 默认属性(
org.springframework.boot.autoconfigure
中定义)。 - 来自
spring.config.import
的属性文件。 - 命令行参数(
--name = value
)。 - 来自
SPRING_APPLICATION_JSON
的属性(嵌入在环境中)。 - ServletConfig 初始化参数。
- ServletContext 初始化参数。
- JNDI 属性(
java:comp/env
)。 - Java 系统属性(
System.getProperties()
)。 - 操作系统环境变量。
- 随机生成的值(通过
random
属性)。 - 打包外部配置文件(
application.properties
或application.yml
文件位于类路径根目录下)。 application - {profile}.properties
或application - {profile}.yml
文件位于类路径根目录下,其中{profile}
是激活的配置文件名称。- 未打包的外部配置文件(
application.properties
或application.yml
文件位于当前运行目录下)。 application - {profile}.properties
或application - {profile}.yml
文件位于当前运行目录下。@ConfigurationProperties
注解的类。- 通过
SpringApplication.setDefaultProperties
设置的默认属性。 - 命令行参数(再次强调,命令行参数拥有最高的优先级)。
六、Spring Boot 数据访问
6.1 Spring Data JPA
Spring Data JPA 是 Spring 提供的一个用于简化数据库访问的框架,它基于 JPA 规范,通过定义接口的方式来实现数据库操作。例如:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByLastName(String lastName);
@Query("SELECT u FROM User u WHERE u.email = ?1")
User findByEmailAddress(String emailAddress);
}
6.2 事务管理
在 Spring Boot 中,可以使用 @Transactional
注解来管理事务。例如:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public User updateUser(Long id, User userDetails) {
User user = userRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("User not found"));
user.setFirstName(userDetails.getFirstName());
user.setLastName(userDetails.getLastName());
return userRepository.save(user);
}
}
6.3 数据库支持
Spring Boot 支持多种数据库,如 MySQL、Oracle、PostgreSQL 等,同时也支持嵌入式数据库,如 H2、HSQLDB 等。可以通过配置数据源和连接池来实现数据库的连接和管理。例如,在 application.yml
中配置 MySQL 数据源:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
七、Spring Boot Web 开发
7.1 REST 服务开发
在 Spring Boot 中,可以使用 @RestController
注解来开发 RESTful Web 服务。例如:
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired private UserService userService;
@GetMapping
public List<User> getAllUsers() {
return userService.findAll();
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.save(user);
}
}
7.2 异常处理
可以使用 @ControllerAdvice
和 @ExceptionHandler
注解来实现全局异常处理。例如:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<?> resourceNotFoundException(ResourceNotFoundException ex) { ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage());
return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
}
}
7.3 静态资源处理
Spring Boot 可以自动处理静态资源,默认情况下,静态资源可以放在 src/main/resources/static
目录下。例如,将 CSS、JS、图片等文件放在该目录下,就可以通过浏览器直接访问。
7.4 模板引擎
Spring Boot 支持多种模板引擎,如 Thymeleaf、FreeMarker、Velocity 等。以 Thymeleaf 为例,在 application.yml
中配置 Thymeleaf:
spring:
thymeleaf:
cache: false
prefix: classpath:/templates/
suffix: .html
然后在 src/main/resources/templates
目录下创建 Thymeleaf 模板文件。
八、Spring Boot 安全管理
Spring Boot 可以集成 Spring Security 来实现安全管理,包括认证、授权、会话管理、CSRF 防护等功能。例如,在 pom.xml
中添加 Spring Security 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
然后创建一个配置类来配置安全规则:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();
}
}
九、Spring Boot 监控与管理
9.1 Actuator
Spring Boot Actuator 提供了对应用进行监控和管理的 REST 端点,通过访问这些端点,可以获得应用的健康信息、指标、环境属性等。例如,在 pom.xml
中添加 Actuator 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后可以通过访问 /actuator/health
端点来查看应用的健康状态。
9.2 日志管理
Spring Boot 默认使用 SLF4J 作为日志门面,并默认提供了 Logback 作为日志实现。可以通过配置文件调整日志级别、输出格式等。例如,在 application.yml
中配置日志级别:
logging:
level:
root: INFO
com.example.demo: DEBUG
十、Spring Boot 高级特性
10.1 自定义 Starter
通过创建自定义 Starter,可以将常用的配置和依赖打包在一起,方便在多个项目中使用。自定义 Starter 通常包含自动配置类和 Starter 依赖。例如,创建一个自定义的 Redis Starter,需要定义自动配置类和 Starter 依赖。
10.2 热部署
Spring Boot 支持热部署,即在不重启应用的情况下,当代码发生变化时自动重新加载类和资源。可以使用 spring - boot - devtools
模块来实现热部署,在 pom.xml
中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
10.3 打包与部署
Spring Boot 应用可以使用 Maven 或 Gradle 打包成 JAR 或 WAR 文件,然后部署到服务器上。也可以将应用部署到 Docker 容器中实现容器化部署。例如,使用 Maven 打包成 JAR 文件:
mvn clean package
然后通过 java - jar
命令运行:
java - jar target/demo - 0.0.1 - SNAPSHOT.jar
综上所述,Spring Boot 是一个功能强大、易于使用的 Java 开发框架,它通过自动配置、起步依赖等特性,大大简化了 Spring 应用的开发和部署过程。掌握 Spring Boot 的相关知识点,可以帮助开发者更高效地构建基于 Spring 生态圈的应用。