一、前言
本文将引入 Spring 框架,开始学习框架的应用。
Spring框架作为一个强大的Java应用程序框架,提供了广泛的功能和模块,旨在简化Java应用的开发过程。它的核心理念是控制反转(IoC)和依赖注入(DI),通过这两个概念,Spring能够实现松散耦合、可维护和可扩展的应用程序开发。
二、内容
2.1 简介
什么是 Spring
框架?它能干什么?
官网定义:
Spring Framework 是一个功能强大的 Java 应用程序框架,旨在提供高效且可扩展的开发环境。它结合了轻量级的容器和依赖注入功能,提供了一种使用 POJO 进行容器配置和面向切面的编程的简单方法,以及一组用于AOP的模块。Spring 框架还支持各种移动应用开发技术,如 Android 和 iOS。此外,它还提供了对事务管理、对象/关系映射、JavaBeans、JDBC、JMS 和其他技术的支持,从而确保高效开发。
简单来说,Spring
是一个支持快速开发的Java EE应用程序的框架。它提供了一系列底层容器与基础设施,一个综合性的编程和配置模型,可以和大量常用的开源框架无缝集成,其主要目的是简化 Java 应用的开发,提高代码的可维护性,并促进松散耦合的设计。
从Spring Framework 6.0 开始,Spring
需要 Java 17+
。
2.2 背景
术语 "Spring" 在不同的语境中有不同的含义,它可以指代整个Spring项目家族,也可以特指Spring框架本身。我们这里的 Spring 指的是 Spring Framework,这个核心框架。
Spring最早由Rod Johnson在他的《Expert One-on-One J2EE Development without EJB》一书中提出,旨在解决J2EE开发中的复杂性和笨重性问题。他提出了一种用轻量级框架替代EJB(Enterprise JavaBeans)的理念,以简化企业应用的开发,并提高可维护性和可测试性。后来,他着手开发了这个框架,并将其命名为Spring Framework。
随着Spring框架的发展和广泛的应用,Spring生态系统逐渐扩展,包括了一系列与Spring Framework紧密相关的项目和模块,其中一些重要的包括:Spring Boot、Spring Cloud、Spring Security等,共同构成了Spring生态系统。
2.3 Spring框架的模块化
Spring框架的强大之处在于其模块化的设计。我们可以根据自己的需要选择并使用不同的模块,更专注于业务需求的实现,而不必过多关心底层的细节。
以下是主要的 Spring 框架模块。
(1)Core
这是Spring框架最基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理。
核心容器的主要组件是 BeanFactory
,BeanFactory
是工厂模式的一个实现,是任何Spring应用的核心。它使用IoC将应用配置和依赖从实际的应用代码中分离出来。
- 控制反转(IoC):IoC是Spring框架的核心理念,它允许开发者将组件的创建和依赖关系的管理交给Spring容器,从而实现了反转控制。
- 依赖注入(DI):DI是通过配置文件或注解的方式注入组件之间的依赖关系,使得组件更加灵活和可维护。
(2)Context
Spring Context模块是Spring框架的核心,它扩展了核心模块中的BeanFactory,提供了一种框架式的Bean访问方式,并引入了企业级功能。
它允许通过配置来定义和管理应用程序中的组件,包括Bean的创建和生命周期管理,并且支持国际化消息(I18N)、支持事件传播机制、提供验证支持等等。
(3)AOP
Spring AOP(面向切面编程)模块用于支持AOP编程。它允许开发者定义横切关注点(cross-cutting concerns)和通用行为,然后将它们应用到应用程序中的多个组件中。
通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中,可以自定义拦截器、切点、日志等操作。
(4)Web
Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文,提供了Spring和其它Web框架的集成,比如Struts、WebWork。还提供了一些面向服务支持,例如:实现文件上传的multipart请求。此外,Spring还支持在这些框架的前后插入拦截器,以实现更灵活的请求处理和处理程序管理。
(5)MVC
Spring MVC是Spring框架提供的面向Web应用的Model-View-Controller(MVC)实现。它允许开发者轻松构建Web应用程序,将应用程序的业务逻辑、用户界面和数据分离开来。Spring MVC提供了一个高度可定制的框架,以满足各种Web应用的需求。
(6)DAO
Spring DAO模块对JDBC(Java数据库连接)进行了抽象封装,提供了一个JDBC的抽象层和异常层次结构,简化了数据访问异常的处理,并能统一管理JDBC事务。这使得数据访问层的开发更加容易。
(7)ORM
Spring ORM模块提供了对现有的ORM(对象关系映射)框架的支持,包括Hibernate、JPA(Java持久化API)、JDO(Java数据对象)等,为这些流行的ORM框架提供了集成方案。它允许开发者在应用程序中使用ORM框架,以便更轻松地将Java对象映射到数据库表。这简化了数据持久性的管理,提高了应用程序的可维护性。
(8)WebFlux
Spring Framework 中包含的原始 Web 框架 Spring Web MVC 是专门为 Servlet API 和 Servlet 容器构建的。反应式堆栈 Web 框架 Spring WebFlux 是在 5.0 版的后期添加的。它是完全非阻塞的,支持反应式流(Reactive Stream)背压,并在Netty,Undertow和Servlet 3.1+容器等服务器上运行。
2.4 如何理解 Spring 的 IoC 和 DI
(1)什么是 IoC
控制反转(Inversion of Control,IoC)是一种面向对象编程的设计原则,我们可以看成是一种设计模型。
控制反转,反转的是什么?
简单来说,这里的反转指的是,不再采用硬编码的方式来 new
对象,将 new
对象的权利交出去,并且对象之间的关系我也不再维护了,都不管了。将控制权从程序的自定义部分反转(交出去)到通用框架中(或者说容器)。
也就是说,将对象的创建权交出去,将对象和对象之间关系的管理权交出去,由第三方容器来负责创建与维护。
这里的好处很明显,可以用来减低代码之间的耦合度,提高代码的可维护性和可扩展性,符合依赖倒置原则和开闭原则。
- 依赖倒置原则(DIP)指的是面向接口编程,面向抽象编程,降低程序的耦合度,提高扩展力。
- 开闭原则(OCP):对扩展开放,对修改关闭。也就是说,你在扩展系统功能的时候,没有修改以前写好的代码,就算符合 OCP 原则。
(2)什么是 DI
前面我们讲了,控制反转(IoC)是一种设计模式,一种编程思想。
那么控制反转常见的实现方式:依赖注入(Dependency Injection,简称DI)
在依赖注入中,对象的依赖关系由外部容器负责注入,而不是由对象自己创建或查找依赖对象。
Spring框架是一个经典的IoC容器,它实现了IoC思想,允许开发者通过依赖注入来管理和控制对象之间的依赖关系。Spring提供了多种方式来实现依赖注入,其中包括:
- 构造方法注入:通过构造方法,将依赖对象传递给目标对象。这是一种常见的依赖注入方式,它确保对象在创建时就具有必要的依赖关系。
- Setter方法注入:通过setter方法,将依赖对象注入到目标对象中。这种方式允许在对象创建后逐个设置依赖,更加灵活。
Spring框架的IoC容器负责管理对象的生命周期、依赖关系和配置信息,开发者只需要关注业务逻辑的实现,而不必担心对象的创建和依赖注入。
2.5 谈谈 Spring 的特点
- 轻量(Lightweight):
- Spring框架在大小和开销方面都非常轻量。完整的Spring框架可以发布为一个小于1MB的JAR文件,且运行时开销微不足道。
- Spring是非侵入式的,应用中的对象不依赖于Spring的特定类。
- 控制反转(Inversion of Control - IoC):
- Spring采用控制反转技术,通过IoC促进松耦合。对象的依赖会通过被动的方式传递进来,而不是由对象自己创建或查找依赖。
- IoC使容器主动将依赖传递给对象,而不是对象从容器中查找依赖。
- 面向切面编程(Aspect-Oriented Programming - AOP):
- Spring提供丰富的面向切面编程支持,允许将应用的业务逻辑与系统级服务(如审计和事务管理)分离开发。
- 应用对象只需关注业务逻辑,而不需要处理其他系统级关注点,如日志或事务管理。
- 容器(Container):
- Spring充当容器的角色,包含并管理应用对象的配置和生命周期。
- 你可以配置每个Bean的创建方式,包括单例或原型,以及它们如何相互关联。但与传统的重量级EJB容器不同,Spring更加轻便和易用。
- 框架(Framework):
- Spring允许将简单组件配置和组合成复杂的应用,通常通过声明式配置,例如在XML文件中。
- Spring提供了丰富的基础功能,如事务管理、持久化框架集成等,以帮助开发者专注于应用逻辑的开发。
三、总结
总的来说,Spring框架是一个轻量级的Java应用程序框架,它的核心目标是简化Java应用的开发过程,提高代码的可维护性和可扩展性。