系列文章导航


Spring Framework 是一个开源的 Java 平台,它为任何部署平台上的基于 Java 的现代企业应用程序提供了全面的编程和配置模型。Spring 框架最初由 Rod Johnson 编写,并于 2003 年 6 月根据 Apache 2.0 许可证首次发布。

Spring 是什么?

Spring 是一个用于企业级 Java 开发的开源框架。Spring Framework 的核心功能可用于开发任何 Java 应用程序,但在 Java EE 平台之上,它提供了一些用于构建 Web 应用程序的扩展。Spring 框架旨在通过启用基于 POJO(Plain Old Java Object)的编程模型,使 J2EE 开发更易于使用,并促进良好的编程实践。

Spring Framework 的重要特征和优点是什么?

Spring 框架建立在两个核心设计概念之上:依赖注入(Dependency Injection, DI)面向切面的编程(Aspect-Oriented Programming, AOP)

Spring 框架的主要功能包括:

  • 轻量级:使用框架进行开发的开销很小。
  • 依赖注入(控制反转):支持编写彼此独立的组件,Spring 容器负责将它们连接在一起以完成工作。
  • 容器管理:Spring IoC 容器管理 Spring Bean 的生命周期和项目特定的配置(例如 JNDI 查找)。
  • Web 支持:Spring MVC 框架可用于创建 Web 应用程序,以及能够返回 XML 和 JSON 响应的静态 Web 服务。
  • 通用任务支持:通过注释或 Spring Bean 配置文件,只需很少的配置即可支持事务管理、JDBC 操作、文件上传、异常处理等。

使用 Spring Framework 的优点:

  • 降低耦合:为了减少应用程序不同组件之间的直接依赖关系,Spring IoC 容器负责初始化资源或 Bean,并将它们作为依赖关系注入。
  • 易于测试:在 Spring 框架中编写单元测试用例很容易,因为业务逻辑与实际的资源实现类没有直接的依赖关系。我们可以轻松地编写测试配置,并为测试目的注入 Mock Bean。
  • 减少样板代码:减少了初始化对象、打开/关闭资源等样板代码的数量。例如 JdbcTemplate 类有助于我们删除 JDBC 编程附带的所有样板代码。
  • 模块化设计:Spring 框架分为几个模块,有助于我们保持应用程序的轻量级。例如,如果我们不需要 Spring 事务管理功能,则无需在项目中添加该依赖项。
  • 功能全面:Spring 框架支持大多数 Java EE 功能甚至更多。它始终跟进新技术,例如曾经有 Spring Android 项目帮助我们为本地 Android 应用程序编写更好的代码。这使得 Spring 框架成为一个完整的软件包,我们不需要为不同的需求而使用不同的框架。

Spring 框架中有哪些不同的模块?

以下是 Spring 框架的主要模块:

  • 核心模块 (Core Module)
  • Bean 模块 (Bean Module)
  • 上下文模块 (Context Module)
  • 表达语言模块 (Expression Language Module)
  • JDBC 模块 (JDBC Module)
  • ORM 模块 (ORM Module)
  • OXM 模块 (OXM Module)
  • Java Messaging Service (JMS) 模块
  • 事务模块 (Transaction Module)
  • Web 模块 (Web Module)
  • Web-Servlet 模块 (Web-Servlet Module)
  • Web-Struts 模块 (Web-Struts Module)
  • Web-Portlet 模块 (Web-Portlet Module)

我们如何在 Spring Framework 中实现 DI?

我们可以使用基于 Spring XML 的配置以及基于 注释 (Annotation) 的配置来在 Spring 应用程序中实现依赖注入 (DI)。

BeanFactory 和 ApplicationContext 有什么区别?

BeanFactory 是基本容器,而 ApplicationContext 是高级容器。ApplicationContext 扩展了 BeanFactory 接口。与 BeanFactory 相比,ApplicationContext 提供了更多功能,例如与 Spring AOP 集成、用于国际化 (i18n) 的消息资源处理等。

什么是 BeanFactory?

BeanFactory 是 Spring 框架的核心,它是一个轻量级容器,用于加载 Bean 定义并管理您的 Bean。它使用 XML 文件配置 Bean,并管理单例定义的 Bean。它还负责生命周期方法并注入依赖项,同时消除了对临时单例模式和工厂模式的手动管理。

为什么需要 Spring 框架?

需要 Spring 框架,因为它提供了以下核心特性:

  • 轻量级容器 (Very Light Weight Container)
  • 全面的框架支持 (Framework)
  • 控制反转 (IOC)
  • 面向切面编程 (AOP)

定义应用程序上下文模块?

这是一个非常重要的模块,提供各种必要的服务,例如 EJB 集成、远程处理、JNDI 访问和调度。它将 Spring 转换为一个完整的框架。它还通过应用生命周期事件来扩展 BeanFactory 的概念,并为国际化消息和验证提供支持。

什么是自动装配?

自动装配 (Autowiring) 用于在协作 Bean 之间建立关系。Spring 容器可以自动解析合作者的 Bean。

自动装配有哪些不同的模式?

自动装配有五种不同的模式:

  • NO:无自动装配。
  • byName:可以通过属性名称完成自动装配。
  • byType:根据属性类型进行自动装配。
  • 构造函数 (Constructor):类似于 byType,但其属性在构造函数中注入。
  • 自动检测 (Autodetect):允许 Spring 从 byType 或构造函数中选择自动装配。

Bean 生命周期的方法有哪些?

Bean 生命周期有两个重要的回调阶段:

  • 初始化:将 Bean 装入容器时调用初始化方法。
  • 销毁:将 Bean 从容器中移除时调用销毁方法。

侦听器的事件有哪些不同类型?

以下是侦听器的不同事件类型:

  • ContextClosedEvent:上下文关闭时调用此事件。
  • ContextRefreshedEvent:初始化或刷新上下文时调用此事件。
  • RequestHandledEvent:当 Web 上下文处理请求时调用此事件。

什么是 Joinpoint?

可以在应用程序中引入切面的点称为连接点 (Joinpoint)。这一点可能是修改字段、调用方法甚至引发异常。此时,可以添加新方面的代码以向应用程序引入新行为。

此时可以将 Aspect 代码插入正常的应用程序流程中以更改当前行为。

AOP 中的建议类型是什么?

Spring AOP 中有 5 种通知 (Advice) 类型:

  1. Before Advice (前置通知)
  2. After Advice (后置通知)
  3. After Returning Advice (返回后通知)
  4. Throws Advice (异常通知)
  5. Around Advice (环绕通知)

命名一些重要的 Spring 模块?

一些重要的 Spring Framework 模块包括:

  • Spring Context:用于依赖注入。
  • Spring AOP:用于面向切面的编程。
  • Spring DAO:使用 DAO 模式进行数据库操作。
  • Spring JDBC:用于 JDBC 和 DataSource 支持。
  • Spring ORM:对 ORM 工具的支持,例如 Hibernate。
  • Spring Web Module:用于创建 Web 应用程序。
  • Spring MVC:用于创建 Web 应用程序、Web 服务等的 Model-View-Controller 实现。

在 AOP 中定义 Aspect, Advice, Pointcut, Joinpoint 和 Advice Arguments?

  • Aspect (切面):Aspect 是实现跨领域关注点的类,例如事务管理。Aspects 可以是配置的普通类,然后在 Spring Bean 配置文件中进行配置;或者我们可以使用 Spring AspectJ 支持,使用 @Aspect 注解将类声明为 Aspect。
  • Advice (通知):Advice 是针对特定连接点采取的操作。就编程而言,它们是在应用程序中达到具有匹配切入点的特定连接点时执行的方法。您可以将 Advice 视为 Spring 拦截器或 Servlet 过滤器。
  • Pointcut (切入点):切入点是与连接点匹配的正则表达式,用于确定是否需要执行通知。Pointcut 使用与连接点匹配的不同种类的表达式。Spring 框架使用 AspectJ 切入点表达语言来确定将在其中应用通知方法的连接点。
  • Joinpoint (连接点):Joinpoint 是应用程序中的特定点,例如方法执行、异常处理、更改对象变量值等。在 Spring AOP 中,连接点始终是方法的执行。
  • Advice Arguments (通知参数):我们可以在 Advice 方法中传递参数。我们可以在切入点中使用 args() 表达式,以将其应用于与参数模式匹配的任何方法。如果使用此选项,则需要在确定参数类型的通知方法中使用相同的名称。

Spring Bean 有哪些不同作用域?

Spring Bean 定义了五个作用域:

  • 单例 (Singleton):将为每个容器创建一个 Bean 实例。这是 Spring Bean 的默认范围。在使用此范围时,请确保 Spring Bean 没有共享的实例变量,否则可能会导致数据不一致问题,因为它不是线程安全的。
  • 原型 (Prototype):每次请求 Bean 时都会创建一个新实例。
  • 请求 (Request):这与 Prototype 范围相同,但是应用于 Web 应用程序。将为每个 HTTP 请求创建一个新的 Bean 实例。
  • 会话 (Session):容器将为每个 HTTP 会话创建一个新 Bean。
  • 全局会话 (Global-session):这用于为 Portlet 应用程序创建全局会话 Bean。

如何在 Spring MVC Framework 中处理异常?

Spring MVC Framework 提供了以下方法来帮助我们实现可靠的异常处理:

  • 基于 Controller:我们可以在控制器类中定义异常处理程序方法。我们所需要做的就是使用 @ExceptionHandler 注解对这些方法进行注释。
  • 全局异常处理程序:异常处理是一个跨领域的问题,Spring 提供了 @ControllerAdvice 注解,我们可以将其与任何类一起使用以定义我们的全局异常处理程序。
  • HandlerExceptionResolver 实现:对于一般的异常,大多数时候我们提供静态页面。Spring Framework 提供了 HandlerExceptionResolver 接口,我们可以实现该接口来创建全局异常处理程序。这种定义全局异常处理程序的其他方法背后的原因是,Spring 框架还提供了默认实现类,我们可以在我们的 Spring Bean 配置文件中定义这些默认实现类,以获得 Spring 框架异常处理的好处。
说明:本文内容基于 Spring Framework 经典架构整理。部分模块(如 Web-Struts、Web-Portlet)及提及的 Spring Android 项目在较新版本(Spring 5.x/6.x)中可能已废弃或不再维护,实际开发请以官方最新文档为准。