Spring in action
v6
SpringBoot3.x - Spring 6.x - Java17+
SpringBoot2.x - Spring 5.x - Java8+
- 构建应用的基础知识
- 与其他应用的集成
- 反应式编 程
- 部署生产环境
SpringBoot在不断优化,越来越适应云原生的开发环境;反应式编程已经度过了理念阶段,逐渐在实际项目中落地;SpringData正在支持越来越多的数据库类型;SpringCloud在借助Netflix相关的项目成功成为微服务开发的首选方案之后,正在慢慢拜托Netflix相关项目的束缚,开始自立门户;SpringNative更是借助GraalVM的东风,已脱离JVM为噱头,成功吸引了一批流量……
我们依然要从依赖注入、面向切面编程和自动配置等特性入手,探索和掌握新技术的发展思路和实现脉络。
以Quarkus、Micronaut为代表的一些新生代开发框架在强力挑战Spring的主导地位。
关于本书的目的是让你学会使用Spring框架、Spring Boot及Spring生态系统中的其他组成部分构建令人赞叹的应用程序。
前言
Spring的基本使命是使Java应用的开发更容易。
无论是创建部署在传统应用服务器上的应用,还是创建部署在云端kubernetes集群上的容器化应用。随着Spring Boot开始提供自动配置、构建依赖辅助和运行时监控等功能,现在是称为Spring开发者的理想时机。
1 Spring起步
20年前最常见的应用形式是基于浏览器的Web应用,后端由关系型数据库作为支撑。但是我们现在感兴趣的还包括如何开发面向云的由微服务组成的应用,这些应用会将数据保存到这种类型的数据库中。另外一个崭新的关注点是反应式编程,他致力于通过非阻塞操作提供更好的扩展性并提升性能。
什么是Spring
任何实际的应用程序都是由很多组件组成的,每个组件负责整个应用功能的一部分,这些组件需要与其他的应用元素协调以完成自己的任务。当应用程序运行时,需要以某种方式创建并引用这些组件。
Spring的核心是提供了一个容器(container)他们通常被称为Spring应用上下文,会创建和管理应用的组件。这些组件也可以被称为bean,会在Spring应用上下文中装配在一起,从而形成一个完整的程序。
将bean装配在一起的行为是通过一种基于依赖租入的模式实现的。此时,组件不会再去创建他所依赖的组件并管理他们的生命周期,使用依赖注入的应用依赖于单独的实体(容器)来创建和维护所有组件,并将其注入到需要他们的bean中。通常,这是公国构造器参数和属性访问方法来实现的。
在历史上,指导Spring应用上下文装配bean的方式是使用一个或多个XML文件,例如:
<bean id = "inventoryService"
class="com.example.InventoryService"/>
<bean id = "productService"
class="com.example.ProductService">
<constructor-arg ref="inventoryService"/>
</bean>
最近版本基于Java的配置更为常见。与XML配置是等价的
@Configuration
public class ServiceConfiguration {
@Bean
public InventoryService inventoryService() {
return new InventoryService();
}
@Bean
public ProductService productService() {
return new ProductService(inventoryService());
}
}
这个配置类的方法上使用@Bean注解进行了标注,这表明这些方法所返回的对象会以bean的形式添加到Spring的应用上下文中(默认情况下,这些bean所对应的bean ID与定义他们的方法名称是相同的)。
相对于XML的配置方式,基于Java的配置有更强大的类型安全性以及更好的重构能力。只有在Spring不能自动配置组件的时候才具有必要性。
自动配置起源于所谓的自动装配(autowiring)和组件扫描(component scanning)。借助组件扫描技术,Spring能够自动发现应用类路径下的组件,并创建bean。借助自动装配技术,Spring能够自动为组件注入他们所依赖的其他bean。
Spring Boot自动配置的能力已经远远超出了组件扫描和自动装配。能够基于类路径中的条目、环境变量和其他因素合理猜测需要配置的组件,并将他们装配在一起。没有代码就是自动装配的本质,也是他如此美妙的原因所在。
初始化Spring应用
使用Spring Initializr初始化应用的方式有很多,作者推荐的是Spring Tool Suite(可以理解为定制版的eclipse),实际工作中更推荐在IntelliJ IDEA中创建新项目。这里本站也提供了初始化地址: https://start.aerion.top/
Spring Boot starter依赖的特别之处在于他们本身并不包含库代码,而是传递性地拉取其他库。
- 构建文件会显著减小且更易于管理,因为这样不必为所需的每个依赖库都声明依赖。
- 思考的点从库的名称转移到提供的功能上来。只需添加starter依赖而不必添加一堆单独的库。