Spring的设计⽬标——《Spring技术内幕》

2024-09-09 04:18
文章标签 java 设计 技术 spring 内幕

本文主要是介绍Spring的设计⽬标——《Spring技术内幕》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

读《Spring技术内幕》第二版,计文柯著。

如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)

  • 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;
  • 同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。

通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在Java EE的应⽤开发中,⽀持POJO和使⽤JavaBean的开发⽅式,使应⽤⾯向接口开发,充分⽀持OO(⾯向对象)的设计⽅法

⽐如,在Java EE应⽤开发中,传统的EJB开发需要依赖按照J2EE规范实现的J2EE应⽤服务器。我们的应⽤在设计,特别是实现时,往往需要遵循⼀系列的接口标准,才能够在应⽤服务器的环境中得到测试和部署。这种开发⽅式,使应⽤在可测试性和部署上都会受到⼀些影响。Spring的设计理念采⽤了相对EJB⽽⾔的轻量级开发思想,即使⽤POJO的开发⽅式,只需要使⽤简单的Java对象或者JavaBean就能进⾏Java EE开发,这样开发的⼊门、测试、应⽤部署都得到了简化。

另⼀⽅⾯,在我们的应⽤开发中,往往会涉及复杂的对象耦合关系,如果在Java代码中处理这些耦合关系,对代码的维护性和应⽤扩展性会带来许多不便。⽽如果使⽤Spring作为应⽤开发平台,通过使⽤Spring的IoC容器,可以对这些耦合关系(对Java代码⽽⾔)实现⼀个⽂本化、外部化的⼯作,也就是说,通过⼀个或⼏个XML⽂件,我们就可以⽅便地对应⽤对象的耦合关系进⾏浏览、修改和维护,这样,可以在很⼤程度上简化应⽤开发。同时,通过IoC容器实现的依赖反转,把依赖 关系的管理从Java对象中解放出来,交给了IoC容器(或者说是Spring框架)来完成,从⽽完成了对象之间的关系解耦:原来的对象-对象的关系,转化为对象-IoC容 器-对象的关系,通过这种对象-IoC容器-对象的关系,更体现出IoC容器对应⽤的平台作⽤。

作为应⽤平台,Spring是怎样实现它的平台功能的呢?我们知道,在Java企业应⽤中,使⽤J2EE应⽤服务器可以开发出符合企业信息化需求的软件应⽤,其实,在这种应⽤场景下,可以将J2EE应⽤服务器看成是Java EE应⽤开发的平台,只是这个平台的设计是从J2EE的技术规范出发的,所以对使⽤者来说,对技术的理解和要求相对较⾼。对于Spring来说,它的定位也是在Java企业应⽤中,与我们熟知的J2EE服务器⼀样,起到⼀个应⽤平台和开发框架的作⽤;同时希望能够集成管理企业应⽤需要⽤到的资源,以及为企业应⽤开发提供平台⽀持,但因为设计的出发点不同,所以在推⼴和使⽤上更有优势。

作为应⽤平台,Spring与UNIX/Windows这样传统意义的操作系统在计算机系统中的作⽤类似,即作为⽤户和机器之间的平台,同时也为⽤户使⽤底层的机器资源提供了应⽤开发环境。不同点只在于,操作系统关⼼的是对存储、计算、通信、外围设备等物理资源的管理,并在管理这些资源的基础上,为⽤户提供⼀个统⼀的服务接口;⽽对于像Spring这样的Java EE企业应⽤开发⽽⾔,其关⼼的是⼀些企业应⽤资源的使⽤,⽐如数据的持久化、数据集成、事务处理、消息中间件、Web2.0应⽤、分布式计算等对⾼效可靠处理企业数据⽅法的技术抽象。具体来说,在J2EE开发中,EJB提供了⼀种模式,⽽Spring提供了另⼀种POJO的开发模式,虽然开发模式不同(也就是使⽤具体资源的模式不同,但出发点却都是⼀样的),但其整体地位和前⾯提到的操作系统有不少可以类⽐的地⽅。

从理解应⽤开发和应⽤平台两者关系的⾓度出发,可以让我们换⼀种视⾓来体会Spring的设计理念,笔者认为,在对Spring的内部设计进⾏分析时,也可以依据 对传统操作系统的认知⽅法(算是找⼀个⼤家都熟知的参考模型来帮助我们理解Spring吧),在设计上把Spring划分为核⼼、组件和应⽤3个基本的层次。希望这种划分能够帮助⼤家在深⼊了解Spring设计的时候,对⼀些具体的模块有⼀个⼤致的定位和参考。

在这样的层次划分中,我们⾸先会看到,Spring体系的核⼼,类似操作系统的Kernel,即IoC容器和AOP模块。对于操作系统的Kernel来说,进程调度器的设计是其关键部分,通过进程调度器,⼀⽅⾯使⽤“进程”这个概念来抽象物理的计算资源,另⼀⽅⾯,可以通过调度算法的设计来实现对计算资源的⾼效使⽤。对Spring来 说,也是⼀样的,⼀⽅⾯,它通过IoC容器来管理POJO对象,以及它们相互之间的耦合关系,使企业的信息(数据)资源可以⽤简单的Java语⾔来抽象和描述;另⼀ ⽅⾯,可以通过AOP,以动态和⾮侵⼊式的⽅式来增强服务的功能。所以,我们可以把IoC容器和AOP模块看做Spring的Kernel,是平台实现的核⼼部分。作为核⼼,它们代表了最为基础的底层抽象,同时也是Spring其他模块实现的基础。虽然作为使⽤者的我们⼤多数是开发者,只是在这两个模块的基础上进⾏相关的配置和使⽤,但是如果能够了解这两个核⼼模块的设计和实现,就像了解Linux核⼼的实现⼀样,毫⽆疑问,会让我们对整个平台的了解更上⼀层楼,对平台的认识也更为全⾯和系统。

另外,在Spring体系中,我们还会看到,在IoC和AOP这两个核⼼模块的⽀持下,Spring简化了Java EE所进⾏的开发。这种简化是指,我们能够不在EJB这么厚重 的环境中使⽤Java EE的基本服务——为应⽤开发提供了许多即开即⽤的系统组件和服务,这些服务涵盖了Java EE各个基本服务,对于其他的服务,也可以根据使⽤情况动态扩展到Spring体系中(只要依据IoC和AOP所约定好的特定模式)。基本说来,Spring体系中已经可以包括我们在应⽤开发中经常⽤到的许多服务了,⽐如事 务处理、Web MVC、JDBC、ORM、远端调⽤,从对⽤户的价值上来说,这些服务相对来说是不可忽视的,因为就算有了⼀个Kernel,打个⽐⽅,如果Linux没有实现许多驱动,Linux这个操作系统对⽤户来说也是没有价值的。设想⼀下,对于⼀个⽤户,只有⼀个光秃秃的Linux Kernel拿到⼿⾥,显卡驱动没有,键盘和⿏标的驱 动没有,桌⾯系统没有,这样的系统能使⽤吗?这样的平台对⼀般的⽤户来说有价值吗?同样的道理,对Spring来说,有了IoC和AOP就相当于有了Spring的Kernel,但如果没有我们前⾯提到的那些即开即⽤的服务,Spring的应⽤和推⼴还会遇到很⼤的障碍。不过值得庆幸的是,Spring通过社区和⾃⼰的努⼒,提供了这些看起来不起眼,却对推⼴起着关键作⽤的部分,从⽽构建出⼀个丰富的⽣态系统。也许,这就暗⽰了interface21和Spring项⽬之间重要的不同之处。由此可以看到,这些由Spring或者其⽣态系统提供的,类似于驱动模块的系统组件,也是Spring平台的有机组成部分,通过这部分组件提供了很多简单的即开即⽤的Java EE服务抽象,从⽽使应⽤在通过POJO来进⾏具体开发时,得到Java EE服务的有⼒⽀持,使应⽤可以更关注应⽤的领域问题,更关注业务逻辑。同时,由于Spring使⽤IoC容器和AOP这 样的核⼼模块来构建这些服务抽象和应⽤,它们本⾝的松耦合设计理念,可以让应⽤通过使⽤简单的开发接⼜或现成的应⽤模板,就可以⽅便地使⽤这些Java EE服务。不但如此,由于这些服务是通过IoC容器和AOP核⼼模块来提供的,对⽤户⽽⾔,绑定的是IoC容器和AOP模块,也就是说绑定的是IoC容器/AOP模块的使⽤接口,⽽不是绑定具体的Java EE服务,也为应⽤灵活地选取不同的服务实现提供了基础。⽐如,根据应⽤需求,⽤户可以选择Hibernate作为ORM⼯具,也可以使⽤iBatis,还可以使⽤其他的类似⼯具。这些不同⼯具和底层服务具体实现的选择都不影响应⽤的架构设计,这也体现了Spring的设计理念——⾯向接⼜开发⽽不依赖于具体的产品实现。

作为⼀个开源项⽬,就像Linux⼀样,Spring本⾝也依靠开源社区的⼒量,形成了⼀个开放的⽣态系统,开源的特性也深深影响了Spring的体系设计。在Spring的发展中,其本⾝就吸收了不少社区的好项⽬,⽐如Spring的Security框架就是来源于⼀个社区贡献Acegi。这个项⽬原意是为Spring应⽤设计的⼀个安全框架,让Spring应⽤更⽅便地处理⼀些安全性的问题,但随着应⽤的推⼴,慢慢也被吸收到Spring项⽬中去,成为⼀个Spring的⼦项⽬,虽然不是Spring Framework的⼀个部分,但也是在应⽤开发中经常使⽤到的。另外,随着技术和应⽤的发展,Spring也在对其他的技术提供⽀持,⽐如对Android移动应⽤开发的⽀持,对Adobe Flex前端应⽤的⽀ 持,对OSGi应⽤的⽀持等,这些都让以Spring为基础构建的Spring⽣态圈更加繁荣。

在对Spring的应⽤过程中,我们没有看到许多在J2EE开发中经常出现的技术规范,相反的是,在Spring的实现中,我们直接看到了许多Java虚拟机特性的使⽤,这和Spring提倡的POJO的开发理念是密不可分的,了解这⼀点,也可以帮助我们加深对Spring设计理念的认识。在Spring的设计中,实现AOP就采⽤了多种⽅式,⽐如它集成了AspectJ框架,同时也有ProxyFactory这种代理⼯⼚的模式,⽽在代理⼯⼚的实现中,既有直接使⽤JVM动态代理Proxy的实现,也有使⽤第三⽅代理类库CGLIB的实现。在设计上,这些特点很好地展⽰了Spring遵循开发的实⽤主义设计理念,这些理念和实现,同时也是我们开发Java EE应⽤很好的参考。

这篇关于Spring的设计⽬标——《Spring技术内幕》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150130

相关文章

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties