Spring概览

2023/12/20 Spring框架

Spring官网 (opens new window)

  • 本章主要以理论为主,总体上认识一下Spring框架,并了解需要学习Spring哪些内容。

# 1、Spring初识

# 1.1、Spring是什么?

Spring框架(Spring Framework)是一个轻量级开源Java容器框架,用于解决企业级应用开发中常见的有关配置、集成、测试、数据访问等一系列问题,极大地提高了开发效率和系统质量

# 1.2、轻量级框架

轻量级框架是指相对于传统的重量级框架而言,更为简单、灵活、精简的一类框架。它们注重解决特定问题,提供核心功能,减少了冗余和复杂性,使得开发过程更加轻便和高效。

特点

  • 简洁和灵活:只提供核心功能,减少了不必要的复杂性和冗余代码。
  • 小巧和高性能:代码库相对较小,只包含必要的组件和功能。专注于核心功能,所以在处理速度上也通常更加高效。
  • 低侵入性:一般不强制采用特定的开发模式或架构,更倾向于为开发人员提供一些基础设施和工具,并允许自由选择如何组织代码和实现业务逻辑。这使得开发人员可以根据自己的习惯和需求进行自由发挥。
  • 易于学习和使用:新手和有限经验的开发人员能够快速上手。
  • 良好的集成和扩展性:可以根据需求集成额外的功能和工具,并根据需要进行扩展。

# 1.3、容器框架

  • Spring是一个容器,用于存放Java对象

我们前面学习了集合框架也是一种容器,集合容器用于存储我们的数据,而Spring则是存放管理对象的容器。把集合和Spring放一起来说不是说Spring和集合有什么关系,而是解释一下容器是用于存储东西,比较好理解。

  • Spring容器可以管理对象的创建和对象之间的关系

我们自己new对象的时候,还要管它的生命周期,对象的创建,销毁我们都需要涉及到,而且还容易遗漏,导致内存没法回收等问题。而这些Spring可以就直接帮我们做了,而且使用的时候,我们也不需要关心对象的创建和销毁,直接使用即可。

  • 从容器中获取要使用的对象

对象已经交给了Spring容器管理了,我们要用某个对象的时候,去容器中找就行了,容器就会给我们了,没有的话他会自己创建后再给我们,我们用完了也不用管,容器会自己监控到你用完了,就自动销毁了。这就是为什么我们在开发中不推荐new对象,而通过Spring来获取对象的原因。

# 1.4、企业级应用

企业级应用是指为满足大规模企业组织的需求,基于复杂业务逻辑和高可扩展性开发的应用程序。企业级应用通常由多个模块或子系统组成,涉及到不同层次和不同部门的业务流程。这些应用在设计和实现上要考虑到高性能、高可靠性、安全性和可维护性等特点。

Spring能够满足上述的所有特点,Spring也是目前最流行之一的企业级应用框架。

# 2、Spring的特性与优势

现在我们已经对Spring有一个大概的了解,那么Spring有哪些特性和优势呢?接下来我们详细的看看。

# 2.1、特性

  • 轻量级:Spring 框架相比于 EJB 和其他重量级框架,轻量级许多,不需要过多的资源消耗。
  • 控制反转(IOC):Spring 框架通过 IoC 实现了对象的创建和管理,解耦了对象与对象之间的依赖关系。
  • 依赖注入(DI):Spring 框架通过 DI 提供了对象之间的依赖关系,使得对象更加独立,组织起来更有序。
  • 面向切面编程(AOP):Spring 框架的 AOP 模块直接将面向切面编程集成到了 Spring 容器中,能够方便地解决业务处理中的横切问题。
  • 易于测试:Spring 框架对 JUnit4 进行了支持,通过 Spring 的测试类,Spring 可以很方便地进行测试驱动开发(TDD)。
  • 面向接口编程:Spring 框架鼓励程序员进行面向接口编程,这不仅有助于降低程序间的耦合,还能提高程序的可扩展性。
  • 容器:Spring 框架就是一个容器,因为它包含并管理应用对象的生命周期和配置。
  • 异常处理:Spring 提供了一个方便的 API 来翻译技术级别的异常(如 SQLException、HibernateException 等)为一致的、未检查的异常。
  • 集成其他框架:Spring 并不排斥其他的开源 Java 框架。实际上,Spring 可以很容易地与 Hibernate,Struts,JSF 等框架集成。
  • 支持事物管理:Spring 提供一种统一的事务管理接口,可以支持各种事务管理,无论是本地事务还是全局事务。

解释一下特性:

  • 轻量级

我们前面已经说了Spring拥有轻量级框架的所有特点,所以Spring是轻量级的,这里不再赘述。

  • 控制反转(IOC)

控制反转(Inversion of Control)就是把对象的控制权限给Spring管理。正向控制是我们自己new来创建管理,这是我们自己的主动权,而控制反转是Spring通过某种方式管理,我们被动接受。

  • 依赖注入(DI)

依赖注入(Dependency Injection)是指我们要依赖(要用的)的对象不需要手动调用 setXX 方法去设置值,而是通过配置赋值。

比如有个User类,里面有个name属性,在User类中需要用到name属性,以前我们是通过setName()给name属性赋值,而Spring就可以通过配置的方式,把name属性值注入到User,这个过程就是依赖注入。

  • 面向切面编程(AOP)

面向切面编程(Aspect Oriented Programming)把程序中的业务流程横切一刀分开,插入特定业务功能。

Spring的特性也是我们需要掌握的重点,后面会专门讲解这些特性。

# 2.2、优势

  • 方便解耦合,简化开发
  • AOP编程的支持
  • 声明式事务的支持
  • 方便程序的测试
  • 方便集成各种优秀的框架
  • 降低JavaEE API(接口)的使用难度
  • Spring源码是经典的学习范例

# 2.3、耦合

什么是耦合?

简单的来说就是程序之间的依赖性

什么是依赖?

Class A 中使用了Class B的属性或者方法,叫做Class A 依赖 Class B

都有什么耦合?

  • 类之间的依赖
  • 方法之间的依赖
  • 解耦合

  • 解耦合是指降低或消除系统不同部分之间的相互依赖性,使得系统中的各个模块或组件可以独立开发、测试、维护和扩展。通过解耦合,系统中的各个部分可以独立演化,互不影响,提高了系统的灵活性、可维护性和可扩展性。
  • 降低程序间的依赖关系
  • Spring解耦的思路

  • 第一步:使用反射机制创建对象,而不是new关键字
  • 第二步:通过读取配置文件来获取要创建的对象的全限定类名

# 2.4、容器管理哪些对象

  • dao类,service类,controller类,工具类等适合把对象放到容器中。
  • spring对象默认都是单例的(在容器中叫这个名称的对象就只有一个)。
  • 实体类对象,servlet、监听器、过滤器等不放入到spring容器中的对象。

# 3、Spring的架构模块

Spring架构图

# 3.1、Spring的核心容器

  • Beans 模块:提供了框架的基础部分,包括控制反转和依赖注入。
  • Core 核心模块:封装了 Spring 框架的底层部分,包括资源访问、类型转换及一些常用工具类。
  • Context 上下文模块:建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。
  • SpEL 模块:提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。

对应源码

# 3.2、数据访问与集成

  • JDBC 模块:提供了一个 JDBC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。
  • ORM 模块:提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。
  • OXM 模块:提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。
  • JMS 模块:指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
  • Transactions 事务模块:支持编程和声明式事务管理。

对应源码

# 3.3、Web模块

  • Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。
  • Servlet 模块:提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。
  • WebSocket 模块:提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。
  • Webflux 模块: Spring WebFlux 是 Spring Framework 5.x中引入的新的响应式web框架。与Spring MVC不同,它不需要Servlet API,是完全异步且非阻塞的,并且通过Reactor项目实现了Reactive Streams规范。Spring WebFlux 用于创建基于事件循环执行模型的完全异步且非阻塞的应用程序。

对应源码

# 3.4、切面编程模块

  • AOP 模块:提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。
  • Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
  • Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
  • messaging 模块:Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。
  • jcl 模块: Spring 5.x中新增了日志框架集成的模块。

对应源码

# 3.5、Test模块

Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。

对应源码

# 4、Spring学习核心内容

# 4.1、IOC控制反转与DI依赖注入

IOC控制反转与DI依赖注入

# 4.2、AOP切面编程

AOP切面编程

# 4.3、Spring框架配置简化

Spring框架配置简化

# 4.4、Spring事务

Spring事务

# 4.5、SpringMVC详解

SpringMVC详解

# 5、Spring源码解析

# 5.1、IOC实现原理源码解析

IOC实现原理源码解析

# 5.2、AOP实现原理源码解析

AOP实现原理源码解析

# 5.3、SpringMVC实现原理源码解析

SpringMVC实现原理源码解析