SpringBoot
Springboot是什么?
Spring Boot 是由 Pivotal 团队提供的基于 Spring 框架的快速开发脚手架,通过少量的配置,快速实现一个完整的 Spring 应用。(Spring工具箱,实现快速开箱即用)
SpringBoot能够做什么?
简化项目配置
自动配置 Spring 和第三方库,减少 XML 配置文件的编写。
提供 application.properties 或 application.yml 文件来集中管理配置。
快速开发微服务
内置支持多种微服务架构组件,如 Eureka、Zuul、Hystrix 等。
支持 RESTful API 的快速开发和部署。
集成多种数据存储
支持关系型数据库(如 MySQL、PostgreSQL)和 NoSQL 数据库(如 MongoDB、Redis)。
提供 JPA、MyBatis 等 ORM 框架的集成支持。
简化 Web 开发
内嵌 Tomcat、Jetty 或 Undertow 服务器,使应用可以独立运行。
支持 Thymeleaf、Freemarker 等模板引擎,方便前端页面开发。
提供生产就绪功能
健康检查、外部化配置、度量监控等功能,帮助开发者构建可维护的应用。
支持日志管理和性能监控。
简化测试
提供强大的测试支持,包括单元测试和集成测试。
支持 MockMvc 进行 Web 层的测试。
支持多种部署方式
可以将应用打包成 JAR 或 WAR 文件,方便部署。
支持 Docker 容器化部署,以及云平台部署(如 AWS、Azure、Google Cloud)。
简化安全控制
集成 Spring Security,提供身份认证和授权功能。
支持 OAuth2、JWT 等安全协议。
支持消息队列
集成 RabbitMQ、Kafka 等消息中间件,支持异步通信和消息处理。
SpringBoot能给我带来什么好处?
提高开发效率,降低开发成本
简化配置
自动配置:Spring Boot 通过自动配置机制,为常见的开发场景提供了默认配置,减少了繁琐的 XML 配置文件编写工作。
集中管理配置:使用 application.properties 或 application.yml 文件集中管理应用配置,便于维护和修改。
快速启动和开发
开箱即用:提供了大量 starter 依赖,方便开发者快速集成各种功能模块,如数据库访问、缓存、安全控制等。
内嵌服务器:内嵌了 Tomcat、Jetty 或 Undertow 服务器,使应用可以独立运行,无需外部部署,加快了开发和测试的速度。
提高开发效率
代码生成:提供了多种代码生成工具和模板,减少重复代码的编写。
热部署:支持热部署功能,可以在不重启应用的情况下更新代码,提高开发效率。
生产就绪功能
健康检查:内置健康检查功能,帮助监控应用的运行状态。
外部化配置:支持从外部文件或环境变量读取配置,便于不同环境下的配置管理。
度量监控:提供度量监控功能,帮助开发者了解应用的性能和资源使用情况。
日志管理:支持多种日志框架,方便日志记录和分析。
微服务支持
微服务架构:内置支持多种微服务架构组件,如 Eureka、Zuul、Hystrix 等,方便构建和管理微服务应用。
服务发现:支持服务发现和注册,便于微服务之间的通信和协调。
断路器:提供断路器功能,增强系统的容错性和稳定性。
集成多种数据存储
关系型数据库:支持 MySQL、PostgreSQL 等关系型数据库,提供 JPA、MyBatis 等 ORM 框架的集成支持。
NoSQL 数据库:支持 MongoDB、Redis 等 NoSQL 数据库,满足不同的数据存储需求。
简化 Web 开发
RESTful API:支持 RESTful API 的快速开发和部署,适合现代 Web 应用和移动应用的后端开发。
模板引擎:支持 Thymeleaf、Freemarker 等模板引擎,方便前端页面开发。
简化测试
单元测试:提供强大的测试支持,包括单元测试和集成测试。
MockMvc:支持使用 MockMvc 进行 Web 层的测试,方便验证控制器逻辑。
测试工具:集成 Testcontainers 等测试工具,方便进行集成测试和端到端测试。
支持多种部署方式
JAR/WAR 包:可以将应用打包成 JAR 或 WAR 文件,方便部署。
容器化部署:支持 Docker 容器化部署,便于在云平台上运行和管理应用。
云平台支持:支持多种云平台(如 AWS、Azure、Google Cloud),方便云原生应用的开发和部署。
安全控制
集成 Spring Security:提供身份认证和授权功能,支持多种安全协议。
OAuth2 和 JWT:支持 OAuth2、JWT 等安全协议,增强应用的安全性。
消息队列支持
消息中间件:集成 RabbitMQ、Kafka 等消息中间件,支持异步通信和消息处理。
事件驱动架构:支持事件驱动架构,提高系统的响应速度和可扩展性。
社区和生态系统
活跃社区:Spring Boot 拥有庞大的开发者社区,提供了丰富的文档、教程和插件。
生态系统:与 Spring 生态系统高度集成,可以轻松使用 Spring Framework 的其他模块和功能。
SpringBoot如何使用?
创建 Spring Boot 项目
使用 Spring Initializr
Spring Initializr 是一个 web 工具,可以帮助你快速生成 Spring Boot 项目的初始结构。你可以通过以下步
骤创建项目:
-
访问 Spring Initializr:
打开浏览器,访问 Spring Initializr。
-
选择项目配置:
Project:选择 Maven 或 Gradle 项目。
Language:选择 Java、Kotlin 或 Groovy。
Spring Boot:选择 Spring Boot 版本。
Project Metadata:填写 Group、Artifact、Name 等信息。
Packaging:选择 Jar 或 War。
Java Version:选择 Java 版本。
Dependencies:添加所需的依赖,如 Web、JPA、Thymeleaf 等。 -
生成项目:
点击 “Generate” 按钮,下载生成的项目压缩包。
解压下载的文件,导入到你喜欢的 IDE 中(如 IntelliJ IDEA、Eclipse)。
项目目录结构
my-spring-boot-app/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/demo/
│ │ │ └── DemoApplication.java
│ │ └── resources/
│ │ ├── application.properties
│ │ └── static/
│ │ └── templates/
│ └── test/
│ ├── java/
│ │ └── com/example/demo/
│ │ └── DemoApplicationTests.java
├── pom.xml (Maven) 或 build.gradle (Gradle)
└── .gitignore
代码编写
添加SpringBoot依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version> <!-- 选择你需要的版本 -->
<relativePath/> <!-- lookup parent from repository -->
</parent>
plugins {
id 'org.springframework.boot' version '2.7.5' // 选择你需要的版本
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
主应用程序类
Spring Boot 应用程序的入口点通常是带有 @SpringBootApplication 注解的主类。例如:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
控制器
创建一个简单的 REST 控制器来处理 HTTP 请求:
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
配置应用
在 src/main/resources/application.properties 文件中配置应用的属性。例如:
server.port=8080
spring.application.name=demo-app
常用注解
1. 核心注解
@SpringBootApplication
作用:这是一个组合注解,包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Configuration
作用:标记一个类为配置类,该类中的方法可以用 @Bean 注解来定义 Spring 管理的 Bean。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
@ComponentScan
作用:扫描指定包及其子包下的组件(如 @Component、@Service、@Repository、@Controller 等)。
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
2. 组件注解
@Component
作用:通用的组件注解,标记一个类为 Spring 管理的 Bean。
@Component
public class MyComponent {
}
@Service
作用:标记一个类为服务层组件。
@Service
public class UserService {
}
@Repository
作用:标记一个类为数据访问层组件。
@Repository
public class UserRepository {
}
@Controller
作用:标记一个类为控制器层组件,通常用于处理 HTTP 请求。
@Controller
public class UserController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
@RestController
作用:组合注解,包含了 @Controller 和 @ResponseBody,用于创建 RESTful 控制器。
@RestController
public class UserController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
3. 注入注解
@Autowired
作用:自动注入依赖,可以用于字段、构造函数、方法等。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
@Value
作用:从配置文件中注入值。
@Service
public class UserService {
@Value("${app.name}")
private String appName;
}
4. 配置注解
@Bean
作用:定义一个 Bean,通常用于配置类中的方法。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
@Profile
作用:指定 Bean 在哪些环境中生效。
@Configuration
@Profile("dev")
public class DevConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder().build();
}
}
5.条件注解
@ConditionalOnClass
作用:当类路径中存在指定类时,才应用该配置。
@Configuration
@ConditionalOnClass(Tomcat.class)
public class TomcatConfig {
}
@ConditionalOnMissingBean
作用:当容器中不存在指定 Bean 时,才应用该配置。
@Configuration
@ConditionalOnMissingBean(DataSource.class)
public class DefaultDataSourceConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder().build();
}
}
@ConditionalOnProperty
作用:当配置文件中存在指定属性且值符合要求时,才应用该配置。
@Configuration
@ConditionalOnProperty(name = "app.enabled", havingValue = "true")
public class AppEnabledConfig {
}
6.其他注解
@RestControllerAdvice
作用:全局异常处理,通常用于处理控制器层的异常。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
}
@RequestMapping
作用:映射 HTTP 请求到控制器的方法。
@RestController
public class UserController {
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers();
}
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
}
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping
作用:分别映射 GET、POST、PUT、DELETE 请求。
@RestController
public class UserController {
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers();
}
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
}
SpringBoot的实现原理是什么?
Spring Boot 的实现原理涉及多个方面,主要包括自动配置、起步依赖(Starter Dependencies)、内嵌服务器、生产就绪功能等。
1.自动配置(Auto-Configuration)
原理
- 条件注解:Spring Boot 使用一系列的条件注解(如 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 等)来决定是否应用某个配置。
- 自动配置类:Spring Boot 在类路径中查找带有 @EnableAutoConfiguration 注解的类,并加载相应的自动配置类。
- 默认配置:自动配置类提供了许多默认配置,这些配置会根据类路径中的依赖和应用的配置文件(如 application.properties)进行调整。
示例
假设你的项目中添加了 spring-boot-starter-web 依赖,Spring Boot 会自动配置一个内嵌的 Tomcat 服务器和一些常用的 Web 组件。
@Configuration
@ConditionalOnClass({ Servlet.class, Tomcat.class })
@ConditionalOnMissingBean(type = "org.springframework.boot.web.servlet.ServletWebServerFactory")
public class TomcatWebServerAutoConfiguration {
// 配置 Tomcat 服务器
}
2. 起步依赖(Starter Dependencies)
原理
- 简化依赖管理:Spring Boot 提供了一系列的 starter 依赖,每个 starter 依赖都包含了特定功能所需的所有依赖。
- 统一版本管理:通过 spring-boot-dependencies BOM(Bill of Materials),Spring Boot 管理了所有依赖的版本,避免了版本冲突。
示例
在 pom.xml 中添加 spring-boot-starter-web 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
这个依赖会自动引入 Tomcat、Spring MVC 等相关依赖。
3. 内嵌服务器
原理
- 内嵌服务器:Spring Boot 支持内嵌的 Tomcat、Jetty 和 Undertow 服务器,这些服务器可以在应用启动时自动运行,无需外部部署。
- 自动配置:Spring Boot 会根据类路径中的依赖自动配置内嵌服务器。
示例
在 pom.xml 中添加 spring-boot-starter-web 依赖,Spring Boot 会自动配置内嵌的 Tomcat 服务器。
4. 生产就绪功能
原理
- 健康检查:Spring Boot 提供了 /actuator/health 端点,用于检查应用的健康状态。
- 外部化配置:支持从外部文件(如 application.properties)或环境变量读取配置。
- 度量监控:提供 /actuator/metrics 端点,用于监控应用的性能和资源使用情况。
- 日志管理:支持多种日志框架,如 Logback、Log4j2 等。
示例
在 application.properties 中配置健康检查:
management.endpoints.web.exposure.include=health,info
5. 主应用程序类
原理
@SpringBootApplication 注解:这是一个组合注解,包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan。
SpringApplication.run 方法:启动 Spring 应用上下文,并加载所有配置。
示例
主应用程序类:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
6. 配置文件
原理
application.properties 或 application.yml:用于集中管理应用的配置。
多环境配置:支持多环境配置文件,如 application-dev.properties、application-prod.properties。
示例
application.properties 文件:
server.port=8080
spring.application.name=demo-app
7. 启动流程
原理
SpringApplication 类:负责启动 Spring 应用上下文。
SpringApplication.run 方法:执行以下步骤:
- 加载配置:从 application.properties 或 application.yml 文件中加载配置。
- 初始化上下文:创建 ApplicationContext 实例。
- 注册监听器:注册 ApplicationListener 监听器。
- 加载自动配置:根据类路径中的依赖加载自动配置类。
- 启动应用:启动应用,包括内嵌服务器(如果有的话)。
8. 生态系统集成
原理
Spring Framework:Spring Boot 基于 Spring Framework,利用其强大的 IoC 容器和 AOP 功能。
其他框架:Spring Boot 集成了许多其他框架和库,如 MyBatis、Hibernate、RabbitMQ 等,提供了开箱即用的支持。
SpringBoot总结
Spring Boot 通过自动配置、起步依赖、内嵌服务器等特性,极大地简化了 Spring 应用的开发和部署过程。它不仅提高了开发效率,还提供了丰富的生产就绪功能,使得开发者能够更加专注于业务逻辑的实现。无论是小型项目还是大型企业应用,Spring Boot 都是一个非常优秀的选择。