Spring框架的详细指南

275 阅读8分钟

在这篇文章中,我们将解释什么是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框架之一。两者在工作方式和用途上都有所不同。让我们来讨论一下它们之间的区别:

SpringStruts
Spring是一个应用框架,包括几个不同的功能,并被用于Java应用的所有层级。Struts是一个MVC框架,主要用于构建基于Java的前端Web应用。
Spring使用了依赖性注入和控制反转。Struts使用Java servlet API并建立在MVC模型之上
Spring是非常轻量级的框架,只需要很少的依赖关系。Struts是非常重量级的,包含大量的依赖关系。
与其他框架的集成非常容易,比如hibernate,它为大多数流行的ORM和API提供了封装。集成是非常困难的,需要大量的配置。
由于依赖性注入和反转控制,它是非常松散的耦合。它是紧耦合的。

Spring和Struts的区别

2.Spring框架的架构

在这一节中,我们将了解Spring Framework 。下图显示了Spring的整体架构和它所组成的模块。

What is Spring - Architecture

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 AOPAspectJ
它提供了高水平的抽象,并简单地实现了面向方面的编程。它有完整的实现面向方面的编程
使用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引入了函数式编程风格,也是GenericApplicationContextAnnotationConfigApplicationContext 的一部分。
  • 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.acceessjdbc.support.nativejdbcmock.staticmocksweb.views.tiles2Morm.hibernate3orm.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的知识,请访问我们的教程