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

相关文章

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll