1.1 什么是Spring
1.1 什么是Spring
我知道你现在可能迫不及待地想要开始编写Spring应用了,我可以向你保证,在本章结束之前,你肯定能够开发一个简单的Spring应用。首先,我将使用Spring的一些基础概念为你搭建一个舞台,帮助你理解Spring是如何运行起来的。
我知道你现在可能迫不及待地想要开始编写Spring应用了,我可以向你保证,在本章结束之前,你肯定能够开发一个简单的Spring应用。首先,我将使用Spring的一些基础概念为你搭建一个舞台,帮助你理解Spring是如何运行起来的。
我知道你现在可能迫不及待地想要开始编写Spring应用了,我可以向你保证,在本章结束之前,你肯定能够开发一个简单的Spring应用。首先,我将使用Spring的一些基础概念为你搭建一个舞台,帮助你理解Spring是如何运行起来的。
我知道你现在可能迫不及待地想要开始编写Spring应用了,我可以向你保证,在本章结束之前,你肯定能够开发一个简单的Spring应用。首先,我将使用Spring的一些基础概念为你搭建一个舞台,帮助你理解Spring是如何运行起来的。
举例来说,假设在应用的众多组件中,有两个是我们需要处理的:库存服务(用来获取库存水平)和商品服务(用来提供基本的商品信息)。商品服务需要依赖于库存服务,这样它才能提供商品的完整信息。图1.1阐述这些bean和Spring应用上下文之间的关系。
在核心容器之上,Spring及其一系列的相关库提供了Web框架、各种持久化可选方案、安全框架、与其他系统集成、运行时监控、微服务支持、反应式编程以及众多现代应用开发所需的特性。
在历史上,指导Spring应用上下文将bean装配在一起的方式是使用一个或多个XML文件(描述各个组件以及它们与其他组件的关联关系)。例如,如下的XML描述了两个bean,也就是InventoryService bean和ProductService bean,并且通过构造器参数将InventoryService装配到了ProductService中:
1 | <bean id="inventoryService" |
但是,在最近的Spring版本中,基于Java的配置更为常见。如下基于Java的配置类是与XML配置等价的:
1 |
|
@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当成一回事。我们会尽可能多地使用SpringBoot,只有在必要的时候才使用显式配置。因为Spring XML配置是一种过时的方式,所以我们主要关注Spring基于Java的配置。
Spring Boot极大地改善了Spring的开发,因此很难想象在没有它的情况下如何开发Spring应用。因此,本书会将Spring和Spring Boot当成一回事。我们会尽可能多地使用SpringBoot,只有在必要的时候才使用显式配置。因为Spring XML配置是一种过时的方式,所以我们主要关注Spring基于Java的配置。