在这篇文章中,我们将解释什么是Spring。我们将了解Spring的架构、核心功能、不同的模块以及Spring 5增加的功能。
Spring框架是一个开源的、轻量级的应用框架和Java平台上的反转控制容器。Spring Framework 的第一个版本于2003年发布。该框架在Java开发者中越来越受欢迎,使其不断发展,最近的一个版本是Spring 5。
1.什么是Spring框架
Spring无疑是最受欢迎的Java企业应用框架。它甚至可以支持最近基于JVM的语言Groovy和Kotin。spring framework ,分为多个模块。在本节中,我们将了解Spring的核心原则依赖注入/控制反转和面向方面的编程(AOP)。
1.1 依赖注入/反转控制
依赖注入是一种软件工程技术,它通过从对象的创建中抽象出对象的使用,使类独立于其依赖关系。Spring对依赖注入的实现被称为控制反转(Inversion of Control)。
在Spring中,由IoC容器管理的应用对象被称为Bean。Bean是一个由Spring IoC容器实例化、组装和管理的对象。Bean的依赖性是在容器使用的配置元数据中定义的。
org.springframework.context.ApplicationContext 代表Spring的IoC容器并负责依赖性管理。配置可以使用XML或一个或多个Java类来定义。
1.2 面向方面的编程
面向方面的编程是对面向对象编程的补充,它提供了另一种结构化程序的方式。AOP在spring中被用来提供:
- 作为EJB的替代品,提供声明式的企业服务
- 允许用户使用自定义的方面
AOP在处理跨领域的问题上非常有帮助,如日志、事务、安全、审计、缓存...等。
1.3.Spring环境
Spring通过暴露一个环境接口来提供应用程序运行的环境信息。它为任何应用程序提供两个非常关键的信息,即配置文件和属性。
1.3.1 配置文件
配置文件是对Bean及其相关属性的逻辑隔离。此外,只有当配置文件处于活动状态时,这些信息才会被使用。一个应用程序可以为其不同的环境或用途拥有几个配置文件,他们可以根据需求激活这些配置文件。一个配置文件可以通过XML配置或使用java注解来配置。
1.3.2 属性
属性是我们在应用程序中设置或外部化的配置。我们向属性传递不同的值,并根据我们的要求维护不同的属性文件。例如,我们可以有两个数据库,一个用于测试数据,一个用于实际数据,所以每当我们想做一些测试时,我们可以指定测试的属性,反之亦然。
1.4 与Struts的区别
Spring和struts是最流行的Java框架之一。两者在工作方式和用途上都有所不同。让我们来讨论一下它们之间的区别:
| Spring | Struts |
| Spring是一个应用框架,包括几个不同的功能,并被用于Java应用的所有层级。 | Struts是一个MVC框架,主要用于构建基于Java的前端Web应用。 |
| Spring使用了依赖性注入和控制反转。 | Struts使用Java servlet API并建立在MVC模型之上 |
| Spring是非常轻量级的框架,只需要很少的依赖关系。 | Struts是非常重量级的,包含大量的依赖关系。 |
| 与其他框架的集成非常容易,比如hibernate,它为大多数流行的ORM和API提供了封装。 | 集成是非常困难的,需要大量的配置。 |
| 由于依赖性注入和反转控制,它是非常松散的耦合。 | 它是紧耦合的。 |
Spring和Struts的区别
2.Spring框架的架构
在这一节中,我们将了解Spring Framework 。下图显示了Spring的整体架构和它所组成的模块。

Spring框架的架构
上图中提到的各种模块将在接下来的章节中讨论。
3.3.Spring框架模块
3.1 Spring核心
Spring核心提供了框架的基本部分,包括依赖注入和IoC。BeanFactory 是一个复杂的工厂模式实现,管理各种Bean的实例化。
Context 模块建立在Bean和IoC之上,增加了国际化、事件传播和资源加载。
表达式语言模块提供表达式语言来查询和操作对象图。
3.2 Spring Web
Web层由Web、Web-servlet、Web-struts和Web-portlets组成。
Spring Web包含了与Web相关的集成功能。基于Spring MVC的实现包含在web-servlet模块中。经典的struts支持可以通过web-struts模块来实现。web-portlet模块提供了可以在portlet环境中使用的MVC实现。
3.3 数据访问
数据访问/集成层由JDBC、ORM、OXM、JMS和事务模块组成。
JDBC模块是对传统JDBC的抽象,它消除了对JDBC模板代码的需求。
ORM模块提供了与JPA、Hibernate、iBatis和JDO等不同ORM框架的简单集成。
OXM模块是对JAXB、Castor、XMLBeans和XStream等对象XML映射的一种抽象。
JMS模块提供了生产和消费消息的设施。
事务模块提供了对程序性和声明性事务的支持。
3.5 AOP和Portlets
Spring AOP提供了面向方面的编程实现来处理跨领域的问题。Aspects模块提供了与另一个流行的库AspectJ的集成。类的工具化和类的加载器支持是由工具化模块提供的。
3.5.1 Spring AOP和AspectJ的区别
| Spring AOP | AspectJ |
| 它提供了高水平的抽象,并简单地实现了面向方面的编程。 | 它有完整的实现面向方面的编程 |
| 使用spring beans实现 | 可以使用任何Java类/领域对象来实现 |
| 指向性方面只能在方法层应用 | 可以在所有级别上应用 |
3.4 测试模块
测试模块使用TestNG和JUnit提供测试支持。它提供了对ApplicationContext和Bean缓存的全面支持。它可以很好地支持模拟对象。
4.Spring 5的特点
自Spring Framework ,该框架不断改进并不断增加新的功能。目前,Spring已经成为企业级Java应用的事实上的选择。最新版本的Spring 5.2.2(Spring 5于2017年9月首次发布)于2019年12月发布。与早期的Spring 4版本相比,Spring 5带来了大量改进。以下是第5版或更高版本中的一些重要功能补充。
- JDK基线更新 - Spring 5是基于Java 8开发的。因此,Java 8是运行Spring Framework 5的最低要求。
- Spring Core改造- Spring Core已经更新,以利用Java 8的新特性。引入了
@Nullable和@NonNull注释,以标记可归零和不可归零的参数和返回值。Spring 5也可以支持默认方法。 - 对Spring容器的更新--Spring 5支持候选组件索引,作为对classpath扫描的一种替代。可以在
META-INF/spring.components中创建一个应用程序构建任务。在大型应用中,从索引中读取实体的性能相当高。Spring 5引入了函数式编程风格,也是GenericApplicationContext和AnnotationConfigApplicationContext的一部分。 - Kotlin支持- Kotlin是一种面向对象的编程语言,支持函数式编程。它在JVM上运行,但不限于此。有了Kotlin支持,开发者可以在Spring中编写函数式程序。
- 反应式编程- Spring Framework 5完全支持反应式编程,这可以支持事件循环式处理。Spring的反应式编程支持建立在Project Reactor之上。
- 测试改进- 它完全支持JUnit 5 Jupiter版本。Jupiter子项目提供了一个在Spring中运行JUnit 5测试的引擎。
TestContext框架允许我们对测试进行并行执行。 - 库支持- Spring支持的许多库,它们的版本已经升级。例如,Hibernate 5.0+、JDBC 4.0+、Jackson 2.6+等等。
- 停止支持--随着Spring 5的推出,
beans.factory.acceess、jdbc.support.nativejdbc、mock.staticmocks、web.views.tiles2M、orm.hibernate3和orm.hibernate4等软件包已经停止使用。此外,像Portlets、velocity、JasperReports、XMLBeans、JDO和Guava等库也已经停止使用。
就这样,我们已经到了本文的结尾。我希望你已经对Spring框架有了一个初步的了解。
5.字段注入与构造函数注入
Constructor和Field Injections在Spring中交替使用,用于注入对象之间的依赖关系。
字段注入用于在声明字段时直接注入依赖关系,这是注入依赖关系的最简单方法。
而构造函数注入则是在定义构造函数时注入依赖关系。
构造函数注入被认为是安全和更好的注入依赖关系的方式,因为它只在依赖关系可用时才创建对象。
6.基于XML和注解的配置
Spring从XML配置文件开始,然后出现了注解,使生活变得更容易。现在,大多数应用都有基于XML和注解的Java配置,这对小型和大型应用都很有效。
XML很有用。有时,当我们在XML文件中定义许多豆类配置时,它就会变得很庞大。虽然Java配置的注释很好,但每当我们做任何改变时,我们都需要进行编译。如果我们的应用程序需要不时地改变配置,那么就用XML吧,这样就不需要每当有变化时就反复编译我们的代码了。另一方面,如果我们认为我们的配置是稳定的或不改变的,就选择基于Java注解的配置。
7.总结
在这篇文章中,我们讨论了spring框架,它的特性,以及各种模块(如core、web、aop等)。我们讨论了它的架构、环境、依赖注入和控制反转。我们还了解了Spring与struts等框架的区别。
如果你想了解更多关于Spring的知识,请访问我们的教程。