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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听