前言
Spring Boot作为一个功能丰富的框架,初学者可能会感到困惑,但通过系统学习官方文档、参考书籍和在线教程,逐渐掌握了其核心概念和用法。Spring Boot的自动配置和约定大于配置的理念极大地简化了配置工作,提高了开发效率,减少了出错的可能性。此外,Spring Boot提供了丰富的开发工具和插件,如Spring Boot CLI和Spring Initializr,这些工具提高了开发效率,让你能更专注于业务逻辑的实现。Spring Boot结合Spring Cloud支持微服务架构,提供了服务注册与发现、负载均衡、断路器等功能,使应用程序更加灵活、可扩展和可维护。最后,Spring Boot拥有庞大的用户群体和活跃的社区,丰富的文档、教程和示例代码提供了丰富的学习资源,为学习和成长提供了机会。总的来说,学习Spring Boot是一项具有挑战性但又非常有价值的任务,通过学习Spring Boot,不仅掌握了一种强大的开发框架,还提高了自己的开发效率和技术能力。
引言
Spring Boot概述
起源与发展:Spring Boot由Pivotal团队于2013年开始研发,2014年4月发布了第一个版本,成为全新的开源轻量级框架。
核心目标:旨在简化Spring应用程序的配置和部署过程,减少开发者在项目搭建和配置上的工作量,使开发者能够更专注于业务逻辑的实现。
核心功能:包括自动配置、内嵌服务器、简化的依赖管理、组件化设计、强大的开发工具支持、健康检查和监控、以及生产就绪性。
集成性:Spring Boot集成了大量常用的第三方库配置,如jackson、jdbc、druid等,几乎可以零配置使用这些库。
优势:包括更快速的构建能力、起步依赖、Actuator监控等功能,提供了丰富的教程和文档以及社区支持,帮助开发者快速上手和解决问题。
适用场景:Spring Boot适用于各种类型的应用程序,包括Web应用、RESTful服务、批处理作业等。
Spring Boot核心功能
独立运行Spring项目:Spring Boot可以以jar包形式独立运行,运行一个Spring Boot项目只需要通过java -jar xx.jar来运行。
内嵌servlet容器:Spring Boot可以选择内嵌Tomcat、Jetty或者Undertow等Web服务器,无须以war包形式部署项目。
提供starter简化Maven配置:Spring Boot通过一系列starter pom来简化Maven的依赖加载,例如spring-boot-starter-web会自动加入相关依赖包。
自动装配Spring:Spring Boot会根据类路径中的jar包、类自动配置Bean,减少手动配置的工作量。如果Spring Boot没有提供的配置支持,可以自定义自动配置。
准生产的应用监控:Spring Boot提供基于http、ssh、telnet的监控工具,对运行时的项目进行监控。
无代码生产和xml配置:Spring Boot通过条件注解实现无代码生产和xml配置,这是Spring 4.x提供的新特性。
Spring Boot优缺点
优点:
- 快速构建项目。
- 主流开发框架的无配置集成。
- 项目可独立运行,无须外部依赖Servlet容器。
- 提供运行时的应用监控。
- 极大提高了开发、部署效率。
- 与云计算的天然集成。
缺点:
- 如果你不认同Spring框架,也许这就是缺点。
Spring Boot特性
创建独立的Spring项目:Spring Boot可以创建独立运行的Spring应用。
内置Tomcat和Jetty容器:Spring Boot内置了Tomcat和Jetty等容器支持。
提供starter简化Maven配置:Spring Boot通过starter POMs简化Maven配置。
提供非功能性特性:Spring Boot提供了一系列大型项目中常见的非功能性特性,如安全、指标、健康检测、外部配置等。
无代码生成和xml配置:Spring Boot通过条件注解实现无代码生成和xml配置。
Spring Boot CLI
Spring Boot CLI:Spring Boot CLI是Spring Boot提供的控制台命令工具,用于快速构建和运行Spring Boot项目。
Spring Boot CLI是一个命令行使用Spring Boot的客户端工具;主要功能如下:
-
运行groovy脚本 => 官网2.1
-
打包groovy文件到jar => 官网2.3
-
初始化Spring Boot项目 => 官网2.4
-
先上个官网文档:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-cli.html
因为这个我们用的比较少,所以就不多赘述了。个人感觉比较流脾的功能就是命令行直接执行groovy脚本了。
Spring Boot Maven构建项目
spring-boot-starter-parent:这是一个特殊的starter,用于提供相关的Maven依赖项,使用后可以省去常用包依赖的版本标签。
pom.xml示例
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
App.java示例
package com.mycompany.app;
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
执行Maven命令
mvn clean install
Spring 核心注解
-
@Component: 这是一个通用注解,它将 Java 类标记为 Spring 的组件。这意味着 Spring 容器可以自动检测和配置这些类。
-
@Service: 特化的 @Component 注解,它用于标记服务层的组件。
-
@Repository: 特化的 @Component 注解,用于标记数据访问层(DAO层)的组件。
-
@Controller: 特化的 @Component 注解,用于标记控制层的组件,如 Spring MVC 控制器。
-
@Autowired: 自动注入依赖项。Spring 容器会在创建 bean 时自动注入标记有此注解的依赖项。
-
@Qualifier: 与 @Autowired 注解一起使用,当有多个 bean 候选者需要自动注入同一个依赖时,用于指定注入哪一个 bean。
-
@Primary: 当有多个同类型的 bean 候选时,被注解为 @Primary 的 bean 会被优先考虑。
-
@Configuration: 表示一个类声明了一个或多个 @Bean 方法,并且可能会被 Spring 容器用来生成 bean 定义和服务请求。
-
@Bean: 用在方法上,表明该方法产生一个由 Spring 容器管理的 bean。
-
@Scope: 定义 bean 的作用域,如单例(singleton)、原型(prototype)、请求(request)、会话(session)等。
-
@Value: 用于注入属性值,可以是硬编码的值,也可以是来自配置文件的值。
Spring MVC 注解
-
@RequestMapping: 用于将 HTTP 请求映射到特定的处理方法上。
-
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping: 是 @RequestMapping 的特化版本,分别用于处理 HTTP 的 GET, POST, PUT, DELETE 请求。
-
@PathVariable: 用于将 URL 中的模板变量映射到方法的参数上。
-
@RequestParam: 用于将请求参数映射到方法的参数上。
-
@RequestBody: 用于将 HTTP 请求体中的 JSON 或 XML 数据绑定到方法的参数上。
-
@ResponseBody: 表明方法的返回值应该被直接写入 HTTP 响应体中,通常用于异步请求。
-
@RestController: 是 @Controller 和 @ResponseBody 的组合注解,用于创建 RESTful 控制器。
Spring Boot 注解
-
@SpringBootApplication: 是一个方便的注解,它包含了 @Configuration, @EnableAutoConfiguration, 和 @ComponentScan。它通常用于主类上,以启动 Spring Boot 应用程序。
-
@EnableAutoConfiguration: 告诉 Spring Boot 根据类路径设置、其他 bean 和各种属性设置开始添加 bean。
-
@EnableAspectJAutoProxy: 启用对 AspectJ 自动代理的支持,允许使用 @Aspect 注解定义切面。
数据访问和事务注解
-
@Transactional: 声明事务的边界。默认情况下,如果在方法执行过程中发生运行时异常,事务将回滚。
-
@EnableJpaRepositories: 启用 JPA 仓库。如果你使用 Spring Data JPA,这个注解会自动配置你的仓库。
测试相关注解
-
@RunWith: 用于定义测试运行器,Spring 中通常用于对 JUnit 的支持。
-
@SpringBootTest: 用于提供 Spring Boot 应用程序测试的配置。
其他注解
-
@Profile: 指定在不同环境下,某些组件是否应该被注册到 Spring 容器中。
-
@PropertySource: 用于指定一个属性文件,Spring 容器会从该文件中加载属性。
Spring Boot事务管理
在Spring Boot中,事务管理是通过Spring框架提供的事务支持来实现的,它基于AOP(面向切面编程)代理,允许你通过声明式的方式对事务进行管理。@Transactional
注解是Spring中用于声明事务边界的一种方式,它可以被应用于类或方法上。
方法事务
当你在方法上使用@Transactional
注解时,Spring会为该方法创建一个事务代理。当这个方法被调用时,Spring会确保它在一个事务上下文中执行。如果方法执行成功,事务会被提交;如果方法抛出运行时异常,事务会被回滚。
类事务
当你在类上使用@Transactional
注解时,Spring会为该类的所有public方法创建事务代理。这意味着类的每个public方法都会在被调用时运行在一个事务上下文中
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
@Transactional
public void myTransactionalMethod() {
// 数据库操作,例如保存数据
myRepository.saveData(someData);
// 如果此处抛出运行时异常,事务会被回滚
if (someCondition) {
throw new RuntimeException("事务执行出错");
}
// 其他数据库操作
}
}
事务传播行为
@Transactional
注解还支持多种事务传播行为,通过propagation
属性来指定。这些传播行为决定了当一个事务方法被另一个事务方法调用时,应该如何处理事务。例如:
Propagation.REQUIRED
:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。Propagation.SUPPORTS
:支持当前事务,如果当前没有事务,就以非事务方式执行。Propagation.MANDATORY
:使用当前的事务,如果当前没有事务,就抛出异常。Propagation.REQUIRES_NEW
:新建事务,如果当前存在事务,把当前事务挂起。Propagation.NOT_SUPPORTED
:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。Propagation.NEVER
:以非事务方式执行,如果当前存在事务,则抛出异常。Propagation.NESTED
:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就执行REQUIRED
行为。
事务隔离级别
除了传播行为,@Transactional
还支持设置事务的隔离级别,通过isolation
属性来指定。隔离级别定义了一个事务可能受其他并发事务影响的程度。例如:
Isolation.DEFAULT
:使用数据库默认的隔离级别。Isolation.READ_UNCOMMITTED
:允许读取尚未提交的更改。可能导致脏读、不可重复读和幻读。Isolation.READ_COMMITTED
:只允许读取已提交的更改。可以防止脏读,但可能出现不可重复读和幻读。Isolation.REPEATABLE_READ
:确保在同一事务中的多次读取将看到相同的数据行。可以防止脏读和不可重复读,但可能出现幻读。Isolation.SERIALIZABLE
:完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。这是最严格的事务隔离级别,但也是最影响性能的。
注意事项
@Transactional
注解只能应用于public方法,因为Spring的事务管理是基于AOP代理实现的,而AOP代理只能拦截public方法的调用。- 当使用
@Transactional
注解时,要确保Spring的AOP代理能够正常工作。这通常意味着你需要通过Spring容器来管理你的bean(例如,使用@Service
、@Component
等注解),而不是通过new
关键字来创建实例。 - 要注意事务的边界和范围,避免事务过大或过小,以免影响性能和一致性。
总结
Spring Boot通过其独立运行、内嵌容器、简化配置、自动装配、监控支持、无代码生成和xml配置等核心功能,显著提高了开发效率。其优点在于快速构建项目、无配置集成主流框架、独立运行项目、提供运行时监控、高效部署、与云计算集成等方面。虽然有不认同Spring框架的缺点,但Spring Boot仍然是现代Java开发中的重要框架之一,提供了丰富的特性、CLI工具、Maven支持以及常用的注解,方便开发者快速构建和运行Spring应用。