16.Spring前世今生与Spring编程思想

2024-06-24 13:48

本文主要是介绍16.Spring前世今生与Spring编程思想,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.1.课程目标

1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。

2、 了解Spring的发展历史,启发思维。

3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。

4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。

5、Spring编程思想总结。

1.2.内容定位

Spring使用经验1-5年 ,希望深入了解Spring源码的人群。

1.3.Spring的前世今生

相信经历过不使用框架开发Web项目的70后、80后都会有如此感触,如今的程序员开发项目太轻松了 ,基本只需要关心业务如何实现,通用技术问题只需要集成框架便可。早在2007年 ,一个基于
Java语言的开源框架正式发布,取了一个非常有活力且美好的名字,叫做Spring。它是一个开源的轻量级Java SE (Java标准版本)/Java EE (Java企业版本)开发应用框架,其目的是用于简化企业级应 用程序开发。应用程序是由一组相互协作的对象组成。而在传统应用程序开发中,一个完整的应用是由
—组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象
协作来完成所需功能,而且要低耦合、高聚合。业务逻辑开发是不可避免的,那如果有个框架出来帮我
们来创建对象及管理这些对象之间的依赖关系。可能有人说了,比如"抽象工厂、工厂方法模式" 不也可以帮我们创建对象," 生成器模式" 帮我们处理对象间的依赖关系,不也能完成这些功能吗?可是这
些又需要我们创建另一些工厂类、生成器类,我们又要而外管理这些类,增加了我们的负担,如果能有
种通过配置方式来创建对象,管理对象之间依赖关系,我们不需要通过工厂和生成器来创建及管理对象
之间的依赖关系,这样我们是不是减少了许多工作,加速了开发,能节省出很多时间来干其他事。Spring 框架刚出来时主要就是来完成这个功能。

Spring框架除了帮我们管理对象及其依赖关系,还提供像通用日志记录、性能统计、安全控制、异 常处理等面向切面的能力,还能帮我管理最头疼的数据库事务,本身提供了一套简单的JDBC访问实现,
提供与第三方数据访问框架集成(如 Hibernate. JPA),与各种Java EE技术整合(如 Java Mail、任
务调度等等),提供一套自己的Web层框架Spring MVC、而且还能非常简单的与第三方Web框架集 成。从这里我们可以认为Spring是一个超级粘合大平台,除了自己提供功能外,还提供粘合其他技术 和框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。而且不管是JAVASE ( C/S
架构)应用程序还是JAVA EE ( B/S架构)应用程序都可以使用这个平台进行开发。如今的Spring已 经不再是一个框架,早已成为了一种生态。SpringBoot的便捷式开发实现了零配置,SpringCloud全 家桶,提供了非常方便的解决方案。接下来,让我们来深入探讨Spring到底能给我们带来什么?

1.4.—切从Bean开始

说到Bean这个概念,还得从Java的起源说起。早在1996年 ,Java还只是一个新兴的、初出茅庐 的编程语言。人们之所以关注她仅仅是因为,可以使用Java的Applet来开发Web应用,作为浏览器 组件。但开发者们很快就发现这个新兴的语言还能做更多的事情。与之前的所有语言不同,Java让模块 化构建复杂的系统成为可能(当时的软件行业虽然在业务上突飞猛进,但当时开发用的是传统的面向过
程开发思想,软件的开发效率一直踟蹰不前。伴随着业务复杂性的不断加深,开发也变得越发困难。其
实 ,当时也是OOP思想飞速发展的时期,她在80年代末被提出,成熟于90年代,现今大多数编程语言都已经是面向对象的)。

同年12月 ,Sun公司发布了当时还名不见经传但后来人尽皆知的JavaBean 1.00-A规范。早期的 Java Bean规范针对于Java ,她定义了软件组件模型。这个规范规定了一整套编码策略,使简单的Java 对象不仅可以被重用,而且还可以轻松地构建更为复杂的应用。尽管JavaBean最初是为重用应用组件 而设计的,但当时他们却是主要用作构建窗体控件,毕竟在PC时代那才是主流。但相比于当时正如日
中天的Delphi. VB和 C++ , 它看起来还是太简易了,以至于无法胜任任何"实际的"工作需要。

复杂的应用通常需要事务、安全、分布式等服务的支持,但 JavaBean并未直接提供。所以到了 1998 年 3 月 ,Sun公司发布了 EJB 1.0规范,该规范把Java组件的设计理念延伸到了服务器端,并提供了 许多必须的企业级服务,但他也不再像早期的JavaBean那么简单了。实际上,除了名字叫EJB Bean 以外,其他的和JavaBean关系不大了。

尽管现实中有很多系统是基于EJB构建的,但 EJB从来没有实现它最初的设想:简化开发。EJB的
声明式编程模型的确简化了很多基础架构层面的开发,例如事务和安全;但另一方面EJB在部署描述符
和配套代码实现等方面变得异常复杂。随看时间的推移,很多开发者对EJB已经不再抱有幻想,开始寻
求更简洁的方法。

现在Java组件开发理念重新回归正轨。新的编程技术AOP和 DI的不断出现,他们为JavaBean提 供了之前EJB才能拥有的强大功能。这些技术为POJO提供了类似EJB的声明式编程模型,而没有引入
任何EJB的复杂性。当简单的JavaBean足以胜任时,人们便不愿编写笨重的EJB组件了。

客观地讲,EJB的发展甚至促进了基于POJO的编程模型。引入新的理念,最新的EJB规范相比之
前的规范有了前所未有的简化,但对很多开发者而言,这一切的一切都来得太退了。到了 EJB3规范发
布时,其他基|=| 于POJO的开发架构已经成为事实的标准了,而 Spring框架也就是在这样的大环境下出
现的。

1.5.Spring的设计初衷

Spring是为解决企业级应用开发的复杂性而设计,她可以做很多事。但归根到底支撑Spring的仅 仅是少许的基本理念,而所有的这些基本理念都能可以追溯到一个最根本的使命:简化开发。这是一个
郑重的承诺,其实许多框架都声称在某些方面做了简化。而 Spring则立志于全方面的简化Java开发。
对此,她主要采取了 4 个关键策略:

1、基于POJO的轻量级和最小侵入性编程;

2、通过依赖注入和面向接口松耦合;

3、基于切面和惯性进行声明式编程;

4、通过切面和模板减少样板式代码;

而他主要是通过:面向Bean(BOP).依赖注入(DI ) 以及面向切面(AOP ) 这三种方式来达成的。

1.6.BOP编程伊始

Spring 是面向 Bean 的编程( Bean Oriented Programming, BOP ) , Bean 在 Spring 中才是真 正的主角。Bean在Spring中作用就像Object对OOP的意义一样Spring中没有Bean也就没有Spring
存在的意义。Spring提供了 IOC容器通过配置文件或者注解的方式来管理对象之间的依赖关系。

控制反转(其中最常见的实现方式叫做依赖注入(Dependency Injection , DI ) , 还有一种方式叫
〃依赖查找〃 ( Dependency Lookup , DL ) ,她在 C+ + 、Java. PHP以及.NET中都运用。在最早的
Spring中是包含有依赖注入方法和依赖查询的/但因为依赖查询使用频率过低,不久就被Spring移除 了 ,所以在Spring中控制反转也被直接称作依赖注入),她的基本概念是:不创建对象,但是描述创建 它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容
器 (在 Spring框架中是IOC容器)负责将这些联系在一起。

在典型的IOC场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。

1.7.依赖注入的基本概念

Spring 设计的核心 org.springframework.beans 包 (架构核心是 org.springframework.core
包 ),它的设计目标是与JavaBean组件一起使用。这个包通常不是由用户直接使用,而是由服务器将 其用作其他多数功能的底层中介。下一个最高级抽象是BeanFactory接口 ,它是工厂设计模式的实现, 允许通过名称创建和检索对象。BeanFactory也可以管理对象之间的关系。

BeanFactory最底层支持两个对象模型。

1.单例:提供了具有特定名称的全局共享实例对象,可以在查询时对其进行检索。Singleton是默
认的也是最常用的对象模型。

2 .原型:确保每次检索都会创建单独的实例对象。在每个用户都需要自己的对象时,采用原型模式。
Bean工厂的概念是Spring作为IoC容器的基础。I0C则将处理事情的责任从应用程序代码转移到
框架。

1.8.AOP编程理念

面向切面编程,即AOP ,是一种编程思想,它允许程序员对横切关注点或横切典型的职责分界线的
行为(例如日志和事务管理)进行模块化。AOP的核心构造是方面(切面),它将那些影响多个类的行
为封装到可重用的模块中。

AOP和 I0C是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典
型的面向对象开发方式中可能要将日志记录语句放在所有方法和Java类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势
就是Java类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP编写的应用程序代码是松散耦合的。

AOP的功能完全集成到了 Spring事务管理、日志和其他各种特性的上下文中。

AOP编程的常用场景有:Authentication权限认证)、Auto Caching(自动缓存处理)、Error Handling (统一错误处理)、Debugging (调试信息输出)、Logging (日志记录)、Transactions (事务处理)
等。

1.9.Spring中的编程思想总结

Spring编程思想

Spring思想应用场景(特点)一句话归纳
OOPObject Oriented Programming (面向对象编程 )用程序归纳总结生活中一切事物。
封装、继承、多态。
BOPBean Oriented Programming (面向 Bean 编程 )面向Bean (普通的Java类 )设计程序, 解放程序员。—切从Bean开始。
AOPAspect Oriented Programming(面向切面编程)找出多个类中有一定规律的代码,开发时拆开 ,运行时再合并。
面向切面编程,即面向规则编程。
解耦,专人做专事。
IOCInversion of Control (控制反转)
将 new对象的动作交给Spring管 理 ,并由 Spring保存已创建的对象(IOC容器)。
转交控制权(即控制权反转)
DI/DLDependency Injection (依 赖 注 入 )或者 Dependency Lookup (依赖查找)
依赖注入、依赖查找,Spring不仅保存自己创 建的对象,而且保存对象与对象之间的关系。
注入即赋值,主要三种方式构造方法、set方法、直接赋值。
赋值

2.0.Springs系统架构

Spring总共大约有20个模块,由 1300多个不同的文件构成。而这些组件被分别整合在核心容器( Core Container) 、AOP ( Aspect Oriented Programming ) 和设备支持( Instrmentation ) 、数 据访问及集成( Data Access/lntegeration ) 、Web、报文发送( Messaging ) 、Test, 6 个模块集合
中。以下是Spring 5 的模块结构图:

image-20200329161644967

组成Spring框架的每个模块集合或者模块都可以单独存在,也可以一个或多个模块联合实现。每个模
块的组成和功能如下:

2.1.核心容器

由 spring-beans、spring-core, spring-context W spring-expression ( Spring Expression
Language, SpEL ) 4 个模块组成。

spring-core和 spring-beans模块是Spring框架的核心模块,包含了控制反转(Inversion of Control, IOC ) 和依赖注入( Dependency Injection, DI) 。 Bean Factory 接口是 Spring 框架中的核
心接口,它是工厂模式的具体实现。Bean Factory使用控制反转对应用程序的配置和依赖性规范与实际 的应用程序代码进行了分离。但 BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被 使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配。

spring-context模块构架于核心模块之上,他扩展了 BeanFactory 为她添加了 Bean生命周期控
制、框架事件体系以及资源加载透明化等功能。此外该模块还提供了许多企业级支持,如邮件访问、远
程访问、任务调度等,Applicationcontext是该模块的核心接口,她的超类是BeanFactory。与 BeanFactory不同,Applicationcontext容器实例化后会自动对所有的单实例Bean进行实例化与依
赖关系的装配,使之处于待用状态。

spring-context-support模块是对Spring IOC容器的扩展支持,以及IOC子容器。

spring-context-indexer 模块是 Spring 的类管理组件和 Classpath 扫描。

spring-expression模块是统一表达式语言(EL )的扩展模块,可以查询、管理运行中的对象,同 时也方便的可以调用对象方法、操作数组、集合等。它的语法类似于传统EL ,但提供了额外的功能,最
出色的要数函数调用和简单字符串的模板函数。这种语言的特性是1基=1 于Spring产品的需求而设计,他 可以非常方便地同Spring IOC进行交互。

2.2.AOP和设备支持

由 spring-aop、spring-aspects 和 spring-instrument 3 个模块组成

spring-aop是 Spring的另一个核心模块,是 AOP主要的实现模块。作为继OOP后 ,对程序员影 响最大的编程思想之一,AOP极大地开拓了人们对于编程的思路。在 Spring中 ,他是以JVM的动态 代理技术为基础,然后设计出了一系列的AOP横切实现,比如前置通知、返回通知、异常通知等,同
时 ,Pointcut接口来匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求
进行切入。

spring-aspects模块集成自AspectJ框 架 ,主要是为Spring AOP提供多种AOP实现方法。

spring-instrument 模块是基于 JAVA SE 中的"java.lang.instrument"进行设计的,应该算是 AOP
的一个支援模块,主要作用是在JVM启用时,生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的功能,实现AOP的功能。在分类里,我把他分在了 AOP模块下,在 Spring官 方文档里对这个地方也有点含糊不清,这里是纯个人观点。

2.3.数据访问与集成

由 spring-jdbc、spring-tx、spring-orm、spring-jms 和 spring-oxm 5 个模块组成。

spring-jdbc模块是Spring提供的JDBC抽象框架的主要实现模块用于简化Spring JDBC操 作 。
主要是提供JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式、事务管理来简化JDBC编程,
主要实现类是 JdbcTemplate、SimpleJdbcTemplate 以及 NamedParameterJdbcTemplateo

spring-tx模块是Spring JDBC事务控制实现模块。使用Spring框 架 ,它对事务做了很好的封装, 通过它的AOP配置,可以灵活的配置在任何一层;但是在很多的需求和应用,直接使用JDBC事务控
制还是有其优势的。其实,事务是以业务逻辑为1基=1 础的;一个完整的业务应该对应业务层里的一个方法;
如果业务操作失败’则整个事务回滚;所以,事务控制是绝对应该放在业务层的;但是,持久层的设计
则应该遵循一个很重要的原则:保证操作的原子性,即持久层里的每个方法都应该是不可以分割的。所
以 ,在使用Spring JDBC事务控制时,应该注意其特殊性。

spring-orm 模块是 ORM 框架支持模块,主要集成 Hibernate, Java Persistence API (JPA)和 Java Data Objects (JDO)用于资源管理、数据访问对象(DAO)的实现和事务策略。

spring-oxm模块主要提供一个抽象层以支撑OXM ( OXM是 Object-to-XML-Mapping的缩写,
它是一个O/M-mapper, 将java对象映射成XML数 据 ,或者将XML数据映射成java对象) ,例如:
JAXB, Castor, XMLBeans, JiBX 和 XStream 等。

spring-jms模 块 (Java Messaging Service ) 能够发送和接收信息, 自 Spring Framework 4.1 以 后 ,他还提供了对spring-messaging模块的支撑。

2.4.Web组件

由 spring-web、spring-webmvc、spring-websocket 和 spring-webflux 4 个模块组成。

spring-web模块为Spring提供了最基1=1 础Web支 持 ,主要建立于核心容器之上,通过Servlet或 者 Listeners来初始化IOC容器,也包含一些与Web相关的支持。

spring-webmvc模块众所周知是一个的Web-Servlet模 块 ,实现了 Spring MVC ( model-view-Controller) 的 Web 应用。

spring-websocket模块主要是与Web前端的全双工通讯的协议。

spring-webflux是一个新的非堵塞函数式Reactive W eb框 架 ,可以用来建立异步的,非阻塞,
事件驱动的服务,并且扩展性非常好。

2.5.通信报文

即 spring-messaging模 块 ,是从Spring4开始新加入的一个模块,主要职责是为Spring框架集
成一些基础的报文传送应用。

2.6.集成测试

即 spring-test模块,主要为测试提供支持的,毕竟在不需要发布(程序)到你的应用服务器或者连接 到其他企业设施的情况下能够执行 些集成测试或者其他测试对于任何企业都是非常重要的。

2.7.集成兼容

即 spring-framework-bom模 块 ,Bill of Materials解 决 Spring的不同模块依赖版本不同问题。

2.8.各模块之间的依赖关系

Spring官网对Spring5各模块之间的关系也做了详细说明:

image-20200329162037265

对Spring5各模块做了一次系统的总结,描述模块之间的依赖关系,希望能对小伙伴们有
所帮助。

image-20200329162056107

接下来的课程中,我们将深入了解Spring的核心模块功能。基本学习顺序为:从 spring-core入手,
其次是 spring-beans 和 spring-aop , 随后是 spring-context, 再其次是 spring-tx 和 spring-orm ,
最后是spring-web和其他部分。

参考资料:

1.《spring 5核心原理与30个类手写实战》谭勇德著

这篇关于16.Spring前世今生与Spring编程思想的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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 声明式事物

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

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

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

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