Spring源码(1) - 什么是Spring?Spring源码入门

13 篇文章 0 订阅
11 篇文章 0 订阅

Spring源码(1) - 什么是Spring?Spring源码入门

为什么要有Spring?
无论在解析源码,还是在看待其他问题上,首先先来看第一个问题,为什么要有Spring?为什么Spring这么流行?为什么会有Spring?

  C++这个语言相信了解过的都知道,其对象是需要手动回收的,而Java的优点之一就是会自动回收不用了的对象。但是如果在一个项目中,如果创建的对象过多,这个创建速度超过了达到回收条件的时限时,内存就会爆掉。那么很多人就会想,很多创建的对象其实都是重复的,能否把这些对象集中起来,不用重复去创建,提高整个对象的利用率,那么就可以降低整个创建过多对象而导致内存爆掉的问题发生概率了。

  应运而生的Spring就出来了,或者说Spring就是带着这样的初衷而出生的。所有的对象都交给Spring这个容器(IOC容器)去管理,那么还节省了开发人员维护这个对象的功夫,还可以让其他框架的对象一样也交给Spring去管理就可以了,那么即便在一个项目应用多个框架的话,维护起来也不会麻烦,如果这个框架不用,那么就把其从Spring容器中移除,不在管理(解耦)即可。

什么是Spring?
官方的定义是:Spring框架是一种轻量级的阶级方案,是构建企业级应用程序的潜在一站式解决方案。

  在写这篇文章时,即便在一开始思考了为什么会有Spring这个框架之后,我也在想,什么是Spring?官方写的含糊其辞的,那么我又在想Spring就是IOC和AOP了吗?

  在结合在以前项目的应用和各种遇到的坑,我给予Spring的定义是:管理项目中所有主动注入容器中的对象的框架。

  给予这个定义的原因在于,每次做项目和面试时,别人问我们都会给予一个回答SSM,Spring必然是包含在其中的,并且Spring用多种形式(单例/多例)管理注入到IOC容器中的对象。

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

  控制反转(Inversion Of Control,IOC):是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度。其中最常见的方式叫依赖注入(Denpendency Injection,DI),还有一种方式叫依赖查找(Dependency Lookup)。

  过程:通过控制反转,对象在被创建时,由一个调控系统内所有对象的外界实体,将其依赖的对象的引用传递给它,即依赖被注入的到对象。

Spring体系
SpringCore

SpringContext

上下文容器,是BeanFactory功能加强的一个接口

SpringWeb

提供Web开发

SpringMVC

针对Web应用的MVC思想

SpringDAO

提供JDBC抽象层,简化了JDBC编码,同时编码更具有健壮性

SpringORM

与流行的ORM框架结合

SpringAOP

面向切面编程

Spring框架结构(v 5.x)

核心容器层(Core Container)

  Core Container(核心容器):包含有Beans、Core、Context、ExpressionLanguae模块。其中Core和Beans模块是框架的基础部分,提供IOC(控制反转)和DI(依赖注入)特性。这里的基础概念是BeanFactory,它提供Factory模式的经典实现来消除对程序性单例模式的需要,并真正的允许你从程序逻辑中分离出依赖关系和配置。





  Core模块:主要包含Spring框架基本的核心工具类,Spring的其他组件都要使用到这个包里的类,Core模块是其他组件的基本核心。





  Beans模块:这个是所有应用都要用到的,包含访问配置文件、创建和管理Bean,以及进行Inversion of Control/Dependency Inection(IOC/DI)操作相关的所有类。





  Context模块:构建于Core和Beans模块基础之上,提供了一种类似于JNDI注册器的框架式对象访问方法。Context模块基础了Beans的特性,为Spring核心提供了大量扩展,添加了对国际化(例如资源绑定)、事件传播、资源加载和对Context的透明创建的支持。Contet同时也支持J2EE的一些特性,例如EJB、JMX和基础的远程处理。AppliationContext接口是Contetext模块的关键。





  Expression Language模块:提供了一个强大的表达式语音用于在运行时查询和操作对象。是JSP2.1规范中定义的Unifedexpression Language的一个扩展。这个语言支持设置/获取属性值,属性的分配,方法的调用,访问数组上下文,容器和索引器,逻辑和算术运算符,命名变量以及Spring的IOCring器中根据名称检索对象,它也支持List投影,选择和一般的List聚合。





  串联:Beans模块是用于操作对象进行的IOC/DI的。Core模块提供工具类方法,用于整个Spring框架。Context模块是在Beans和Core模块已经完成了对对象的IOC/DI的操作之后,提供了面向不同环境的一些高级特性(国际化)。Expression Language模块则是为了方面所有的模块进行编写,比如 * 这个字符的解析。

数据访问/集成层(Data Access/Integration)

  这个在听名字就知道了,就是提供与其他中间件的交互模块的,包括有JDBC、OXM、JMS、Transaction模块。

  JDBC模块:提供了一个JDBC抽象层,可以消除冗长的JDBC编码和解析数据库厂商的错误代码。这个模块包含了Spring对JDBC数据访问进行封装的所有类。





  ORM(Object Relational Mapping):名为对象关系映射模块,这个为对象-关系映射的API,如Hibernate、Mybatis这些ORM框架,提供了一个交互层,利用ORM封装包,可以混合使用所有Spring提供的特性进行O/R映射。如简单的声明式事务管理。

  Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate、MybatisSQL Map。所有这些都遵从Spring的通用事务和DAO异常层次结构。





  OXM模块:提供了一个对Object/XML映射实现的抽象层,Object/XML映射实现包括JAXB、Castor、XMLBeans、JiBX和XStream。





  JMS(Java Messageing Service)模块:包括了一些制造和消费消息的特性。





  Transaction模块:支持编程和声明式的事务管理,这些事务类必须实现特定的接口,并且对所有POJO都适用。

Web层

  Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用成提供了上下文。所以Spring框架支持与Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。Web层包含了Web、Web-Servlet、Web-Struts和Web-Porlet模块。





  Web模块:提供了基础的面向Web的集成特性,比如多文件上传,使用Servlet LiSteners初始化IOC容器以及一个面向Web的应用上下文,还包含Srping远程支持中Web的相关部分。





  Web-MVC模块:包含Spring的Model-View-Controller(MVC)的实现。Spring的MVC框架使得模型范围内的代码和Web Forms之间能够清楚的分离开来,并与Spring框架的其他特性集成在一起。

  Web-Socket模块:提供了与Web前端的全双工通讯协议。





  Web-Flux模块:是一个新的非阻塞函数式Reactive Web框架,可以用来建立异步、非阻塞,事件驱动的服务,并且扩展性非常好。





  串联:Web模块提供基础。WebMVC模块提供MVC分离。Web-Socket模块在Web模块和WebMVC模块的基础上提供代码解耦的网络链接。WebFlux模块提供非阻塞的形式来去实现NIO的特性。

AOP、Aspects、Instrmentation(设备支持)

  AOP(Aspect Oraiented Programming)模块:AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现,可以让定义例如方法拦截器和切点。从而将逻辑代码分开,降低耦合性。利用Source-Level的元数据功能,还可以将各种行为信息合并到代码中。

  通过Spring配置管理的特性,Spring AOP模块之间将面向切面的功能集成到Spring框架中,所以很容易的使得Spring框架管理的任何对象支持AOP。为基于Spring的应用成的对象提供事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以加个声明式事务管理集成到应用程序中。





  Aspects模块:提供AspectJ的集成支持,AspectJ是一个面向切面的框架,并且它还扩展了Java语言,主要是为Spring AOP提供多种AOP实现方法。





  Instrumentation(设备支持)模块:提供了Class Instrumentation(类仪器)支持和Class Loader(类加载)的实现,使得可以在特定的应用服务器上使用。应该算是AOP的一个支援模块,主要作用是在JVM启用时,生成一个代理类,开发者可以通过代理类在运行时修改类的字节,从而改变一个类的功能,实现AOP的功能。

Messaging

  Messaging模块:这是从Spring4开始新加入的一个模块,主要是为Spring框架继承一些基础的报文传送应用。

Test层

  Test模块:用于使用Junit和TestNG对Spring组件进行测试。

串联

  核心容器层(Core Container)提供了基础,帮助应用管理对象。

  数据访问/集成层(Data Access/Integration)提供了对象与数据库的交互性映射。

  Web层提供了网络交互的相关组件。

  AOP、Asepects、Instramenetation提供了辅助型的增强功能,让整个开发更简单,也增强了健壮性(比如AOP日志)。

  Message提供了对一些消息的报文传送的优化等内容,为其他层提供增强型的辅助功能。

  Test层为其他层增强了健壮性。

Spring源码结构(v5.2.7.RELEASE)
在浏览器搜索很多Spring源码解析相关的文章,一上来就告诉你Spring IOC是什么?源码是怎么样的?让我们很困惑,在了解了Spring的框架结构之后,会发现其实Spring源码阅读似乎只需要阅读其中一些核心模块即可,其他的辅助模块其实是可以在使用到在去阅读的。

  现在在来看看Spring的源码结构究竟是怎么样的,以及和刚刚讲的Spring框架结构有什么关联。



  Srping总共大约有20个模块,1300多个不同的文件组成。而这些组件被分别整合在核心容器层(Core Container)、数据访问及集成(Data Access/Integeration)、AOP、Web、Messaging、Test这几个模块中。

核心容器层(Core Container)
核心层是这4个模块组成的。1、spring-beans,2、spring-core,3、spring-cotext,4、spring-expression。

  spring-beans和spring-core模块:是Spring框架的核心模块,包含了IOC(控制反转,Inversion of Control)和DI(依赖注入,Dependency Injection)。BeanFactory接口是Spring框架中的核心结构,它是工厂模式的具体实现。

BeanFactory使用控制反转对应用程序的配置和依赖性规范与实际应用程序代码进行分离。但BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时,BeanFactory才会对该Bean进行实例化与依赖关系的装配。

  spring-context模块:构架于spring-beans和spring-core模块之上,这个模块扩展了BeanFactory,为BeanFactory添加了Bean生命周期控制、框架事件体系以及资源加载透明化等功能。而且这个模块还提供了很多企业级的支持,比如邮件访问、远程控制、任务调度等。

  ApplicationContext是该模块的核心接口,是BeanFactory的超类,与BeanFactory不同,ApplicationCotext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。





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

数据访问/集成层(Data Access/Integration)
数据访问/集成层是这5个模块组成。1、spring-jdbc,2、spring-tx,3、spring-orm,4、spring-jms,5、spring-oxm。

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





  spring-tx模块:这个是Spring JDBC事务控制实现模块。Spring框架对事务做了很好的封装,通过它的AOP配置,可以灵活的配置在任何一层。但是在很多需求和应用中,直接使用JDBC事务控制还是有优势的。

  其实事务是以业务逻辑为基础的,一个完整的业务应该对应业务层里的一个方法。如果业务操作失败,则整个事务回滚。所以事务控制绝对应该放在业务层的。但是持久层的设计则应该遵循保证操作的原子性,即持久层里的每个方法都是不可以分割的。所以在使用Spring JDBC事务时,要特别注意其特殊性。





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





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





  spring-oxm模块:提供了一个抽象层以支撑OXM(Object XML Mapping),是一个O/M-mapper,将java对象映射成XML数据,或者讲XML数据映射成java对象,比如JAXB、XMLBeans、XStream等。

Web层
Web层是这4个模块组成的。1、spring-web,2、spring-webmvc,3、spring-websocket,4、spring-webflux。

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





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





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





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

AOP、Aspects、Instrmentation(设备支持)
这一层是这3个模块组成的。1、spring-aop、2、spring-aspects、3、spring-instrument。

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

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

  spring-instrument(设备支持)模块:这个是基于Java SE中的java.lang.instrument进行设计的,应该算是AP一个支援模块,主要作用是在JVM启动时,生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的功能,实现AOP的功能。

Messaging
Messaging这一层是1个模块组成。1、spring-messaging。

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

Test层
Test这一层是1个模块组成。1、spring-test。

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

Spring包依赖图

img

最后:

我们身为技术人员,最怕的就是安于现状,一直在原地踏步,那么你可能在30岁就会迎来自己的职业危机,因为你工作这么久提升的只有自己的年龄,技术还是万年不变!

如果你想在未来能够自我突破,圆梦大厂,那或许以上这份Java学习资料,你需要阅读阅读,希望能够对你的职业发展有所帮助。

获取方式: 只需你**点赞+关注**后,进[Java架构资源交流群] ,找管理员获取哦-!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值