我知道你现在可能迫不及待地想要开始编写Spring应用了。我向你保证,在本章结束之前,你肯定能够开发一个简单的Spring应用。但首先,我将使用Spring的一些基础概念为你搭建一个舞台,帮助你理解Spring是如何运转起来的。
任何实际的应用程序都是由很多组件组成的,每个组件负责整个应用功能的一部分,这些组件需要与其他的应用元素协调以完成自己的任务。当应用程序运行时,需要以某种方式创建并引入这些组件。
Spring的核心是提供了一个容器(container)。它们通常被称为Spring应用上下文(Spring application context),会创建和管理应用的组件。这些组件也可以称为bean,会在Spring应用上下文中装配在一起,从而形成一个完整的应用程序,这类似于砖块、砂浆、木材、管道和电线组合在一起,形成一栋房子。
将bean装配在一起的行为是通过一种基于依赖注入(Dependency Injection,DI)的模式实现的。此时,组件不会再去创建它所依赖的组件并管理它们的生命周期,使用依赖注入的应用依赖于单独的实体(容器)来创建和维护所有的组件,并将其注入到需要它们的bean中。通常,这是通过构造器参数和属性访问(property accessor)方法来实现的。
举例来说,假设在应用的众多组件中,有两个是我们需要处理的:库存服务(用来获取库存水平)和商品服务(用来提供基本的商品信息)。商品服务需要依赖于库存服务,这样它才能提供商品的完整信息。图1.1阐述了这些bean和Spring应用上下文之间的关系。
图1.1 应用组件通过Spring的应用上下文来进行管理并实现互相注入
在核心容器之上,Spring及其一系列的相关库提供了Web框架、各种持久化可选方案、安全框架、与其他系统集成、运行时监控、微服务支持、反应式编程模型,以及众多现代应用开发所需的其他特性。
在历史上,指导Spring应用上下文将bean装配在一起的方式是使用一个或多个XML文件,这些文件描述了各个组件以及它们与其他组件的关联关系。例如,如下的XML描述了两个bean —— InventoryService bean和ProductService bean,并且通过构造器参数将InventoryService装配到ProductService中:
- <bean id = "inventoryService"
- class = "com.example.InventoryService" />
-
- <bean id = "productService"
- class = "com.example.ProductService" />
- <constructor-arg ref = "inventoryService" />
- </bean>
但是,在最近的Spring版本中,基于Java的配置更为常见。如下基于Java的配置类是与XML配置等价的:
- @Configuration
- public class ServiceConfiguration {
- @Bean
- public InventoryService inventoryService() {
- return new InventoryService();
- }
-
- @Bean
- public ProductService productService() {
- return new ProductService(inventoryService());
- }
- }
@Configuration注解会告知Spring这是一个配置类,它会为Spring应用上下文提供bean。
这个配置类的方法上使用@Bean注解进行了标注,这表明这些方法所返回的对象会以bean的形式添加到Spring的应用上下文中(默认情况下,这些bean所对应的bean ID与定义它们的方法名称是相同的)。
相对于基于XML的配置方式,基于Java的配置会带来多项额外的收益,包括更强的类型安全性以及更好的重构能力。即便如此,不管是使用Java还是使用XML的显式配置,都只有在Spring不能自动配置组件的时候才具有必要性。
在Spring技术中,自动配置起源于所谓的自动装配(autowiring)和组件扫描(component scanning)。借助组件扫描技术,Spring能够自动发现应用类路径下的组件,并将它们创建成Spring应用上下文中的bean。借助自动装配技术,Spring能够自动为组件注入它们所依赖的其他bean。
最近,随着Spring Boot的引入,自动配置的能力已经远远超出了组件扫描和自动装配。Spring Boot是Spring框架的扩展,提供了很多生产效率方面的增强。最为大家所熟知的增强就是自动配置(autoconfiguration),Spring Boot能够基于类路径中的条目、环境变量和其他因素合理猜测需要配置的组件,并将它们装配在一起。
我非常愿意为你展现一些关于自动配置的示例代码,但是我做不到。自动配置就像风一样,你可以看到它的效果,但是我找不到代码指给你说,“看!这就是自动配置的样例!”事情发生了,组件启用了,功能也提供了,但是不用编写任何的代码。没有代码就是自动装配的本质,也是它如此美妙的原因所在。
Spring Boot的自动配置大幅度减少了构建应用所需的显式配置的数量(不管是XML配置还是Java配置)。实际上,当完成本章的样例时,我们会有一个可运行的Spring应用,该应用只有一行Spring配置代码。
Spring Boot极大地改善了Spring的开发,很难想象在没有它的情况下如何开发Spring应用。因此,本书会将Spring和Spring Boot当成一回事。我们会尽可能多地使用Spring Boot,只有在必要的时候才使用显式配置。因为Spring XML配置是一种过时的方式,所以我们主要关注Spring基于Java的配置。
闲言少叙,既然本书的名称中包含“实战”这个词,那么就开始动手吧!下面我们将会编写使用Spring的第一个应用。
本书是一本经典而实用的Spring学习指南,介绍了Spring使用框架、Spring Boot,以及Spring系统中的其他组成部分。
本书分为4个部分,共18章。第1部分(第1章~第6章)涵盖了构建Spring应用的基础知识。第2部分(第7章~第10章)讨论了如何将Spring应用与其他应用进行集成。第3部分(第11章~第14章)探讨了Spring对反应式编程提供的全新支持。第4部分(第15章~第18章)介绍了如何做好应用投入生产环境前的准备工作,以及如何进行部署。
本书适合刚刚开始学习Spring Boot和Spring框架的Java开发人员阅读,也适合想要超越基础知识并学习Spring新特性的经验丰富的Spring开发者参考。
谁适合阅读本书
本书适合刚刚开始学习Spring Boot和Spring框架的Java开发人员阅读,也适合想要超越基础知识并学习Spring新特性的经验丰富的Spring开发者参考。
本书是Spring和Spring Boot指南,在第5版基础上进行了升级更新,以反映这两项技术所提供的新内容。即便是Spring新手,在第1章结束之前,也可以启动并运行第一个Spring应用。跟随本书,你会学习创建Web应用、处理数据、保证应用安全,以及管理应用配置等内容。接下来,你会探索将Spring应用与其他应用程序集成的方法,以及如何让Spring应用从反应式编程中获益,包括使用新的RSocket通信协议。在本书的末尾,你会看到如何为生产环境准备我们的应用程序,并学习各种部署方案。
无论你是第一次接触Spring,还是有多年的Spring开发经验,这本书都会带你开展一段精彩旅程。我为你感到兴奋,也很荣幸能为你编写这份指南。我期待你使用Spring创造出精彩的应用!