版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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:BeanOrientedProgramming),Bean在Spring中才是真正的主⾓,即对象。Bean在Spring中的作⽤就像Object对OOP的意义⼀样,没有对象的概念就像没有⾯向对象编程,Spring中没有Bean也就没有Spring存在的意义。Spring提供了通过配置⽂件或者注解的⽅式来管理对象之间的依赖关系。控制反转(InversionOfControl,IOC):是⾯向对象编程中的⼀种设计原则,可以⽤来减低代码之间的耦合度。其中最常见的⽅式叫依赖注⼊(DenpendencyInjection,DI),还有⼀种⽅式叫依赖查找(DependencyLookup)。过程:通过控制反转,对象在被创建时,由⼀个调控系统内所有对象的外界实体,将其依赖的对象的引⽤传递给它,即依赖被注⼊的到对象。Spring体系SpringCoreSpringContextSpringWebSpringMVCSpringDAOSpringORM上下⽂容器,是BeanFactory功能加强的⼀个接⼝提供Web开发针对Web应⽤的MVC思想提供JDBC抽象层,简化了JDBC编码,同时编码更具有健壮性与流⾏的ORM框架结合SpringAOP⾯向切⾯编程Spring框架结构(v5.x)核⼼容器层(CoreContainer)CoreContainer(核⼼容器):包含有Beans、Core、Context、ExpressionLanguae模块。其中Core和Beans模块是框架的基础部分,提供IOC(控制反转)和DI(依赖注⼊)特性。这⾥的基础概念是BeanFactory,它提供Factory模式的经典实现来消除对程序性单例模式的需要,并真正的允许你从程序逻辑中分离出依赖关系和配置。Core模块:主要包含Spring框架基本的核⼼⼯具类,Spring的其他组件都要使⽤到这个包⾥的类,Core模块是其他组件的基本核⼼。Beans模块:这个是所有应⽤都要⽤到的,包含访问配置⽂件、创建和管理Bean,以及进⾏InversionofControl/DependencyInection(IOC/DI)操作相关的所有类。Context模块:构建于Core和Beans模块基础之上,提供了⼀种类似于JNDI注册器的框架式对象访问⽅法。Context模块基础了Beans的特性,为Spring核⼼提供了⼤量扩展,添加了对国际化(例如资源绑定)、事件传播、资源加载和对Context的透明创建的⽀持。Contet同时也⽀持J2EE的⼀些特性,例如EJB、JMX和基础的远程处理。AppliationContext接⼝是Contetext模块的关键。ExpressionLanguage模块:提供了⼀个强⼤的表达式语⾳⽤于在运⾏时查询和操作对象。是JSP2.1规范中定义的UnifedexpressionLanguage的⼀个扩展。这个语⾔⽀持设置/获取属性值,属性的分配,⽅法的调⽤,访问数组上下⽂,容器和索引器,逻辑和算术运算符,命名变量以及Spring的IOCring器中根据名称检索对象,它也⽀持List投影,选择和⼀般的List聚合。串联:Beans模块是⽤于操作对象进⾏的IOC/DI的。Core模块提供⼯具类⽅法,⽤于整个Spring框架。Context模块是在Beans和Core模块已经完成了对对象的IOC/DI的操作之后,提供了⾯向不同环境的⼀些⾼级特性(国际化)。ExpressionLanguage模块则是为了⽅⾯所有的模块进⾏编写,⽐如*这个字符的解析。数据访问/集成层(DataAccess/Integration)这个在听名字就知道了,就是提供与其他中间件的交互模块的,包括有JDBC、OXM、JMS、Transaction模块。JDBC模块:提供了⼀个JDBC抽象层,可以消除冗长的JDBC编码和解析数据库⼚商的错误代码。这个模块包含了Spring对JDBC数据访问进⾏封装的所有类。ORM(ObjectRelationalMapping):名为对象关系映射模块,这个为对象-关系映射的API,如Hibernate、Mybatis这些ORM框架,提供了⼀个交互层,利⽤ORM封装包,可以混合使⽤所有Spring提供的特性进⾏O/R映射。如简单的声明式事务管理。Spring框架插⼊了若⼲个ORM框架,从⽽提供了ORM的对象关系⼯具,其中包括JDO、Hibernate、MybatisSQLMap。所有这些都遵从Spring的通⽤事务和DAO异常层次结构。OXM模块:提供了⼀个对Object/XML映射实现的抽象层,Object/XML映射实现包括JAXB、Castor、XMLBeans、JiBX和XStream。JMS(JavaMessageingService)模块:包括了⼀些制造和消费消息的特性。Transaction模块:⽀持编程和声明式的事务管理,这些事务类必须实现特定的接⼝,并且对所有POJO都适⽤。Web层Web上下⽂模块建在⽴应⽤程序上下⽂模块之上,为基于Web的应⽤成提供了上下⽂。所以Spring框架⽀持与JakartaStruts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的⼯作。Web层包含了Web、Web-Servlet、Web-Struts和Web-Porlet模块。Web模块:提供了基础的⾯向Web的集成特性,⽐如多⽂件上传,使⽤ServletLiSteners初始化IOC容器以及⼀个⾯向Web的应⽤上下⽂,还包含Srping远程⽀持中Web的相关部分。Web-MVC模块:包含Spring的Model-View-Controller(MVC)的实现。Spring的MVC框架使得模型范围内的代码和WebForms之间能够清楚的分离开来,并与Spring框架的其他特性集成在⼀起。Web-Socket模块:提供了与Web前端的全双⼯通讯协议。Web-Flux模块:是⼀个新的⾮阻塞函数式ReactiveWeb框架,可以⽤来建⽴步异、⾮阻塞,事件驱动的服务,并且扩展性⾮常好。串联:Web模块提供基础。WebMVC模块提供MVC分离。Web-Socket模块在Web模块和WebMVC模块的基础上提供代码解耦的⽹络链接。WebFlux模块提供⾮阻塞的形式来去实现NIO的特性。AOP、Aspects、Instrmentation(设备⽀持)AOP(AspectOraientedProgramming)模块:AOP模块提供了⼀个符合AOP联盟标准的⾯向切⾯编程的实现,可以让定义例如⽅法拦截器和切点。从⽽将逻辑代码分开,降低耦合性。利⽤Source-Level的元数据功能,还可以将各种⾏为信息合并到代码中。通过Spring配置管理的特性,SpringAOP模块之间将⾯向切⾯的功能集成到Spring框架中,所以很容易的使得Spring框架管理的任何对象⽀持AOP。为基于Spring的应⽤成的对象提供事务管理服务。通过使⽤SpringAOP,不⽤依赖EJB组件,就可以加个声明式事务管理集成到应⽤程序中。
Aspects模块:提供AspectJ的集成⽀持,AspectJ是⼀个⾯向切⾯的框架,并且它还扩展了Java语⾔,主要是为SpringAOP提供多种AOP实现⽅法。Instrumentation(设备⽀持)模块:提供了ClassInstrumentation(类仪器)⽀持和ClassLoader(类加载)的实现,使得可以在特定的应⽤服务器上使⽤。应该算是AOP的⼀个⽀援模块,主要作⽤是在JVM启⽤时,⽣成⼀个代理类,开发者可以通过代理类在运⾏时修改类的字节,从⽽改变⼀个类的功能,实现AOP的功能。MessagingMessaging模块:这是从Spring4开始新加⼊的⼀个模块,主要是为Spring框架继承⼀些基础的报⽂传送应⽤。Test层Test模块:⽤于使⽤Junit和TestNG对Spring组件进⾏测试。串联核⼼容器层(CoreContainer)提供了基础,帮助应⽤管理对象。数据访问/集成层(DataAccess/Integration)提供了对象与数据库的交互性映射。Web层提供了⽹络交互的相关组件。AOP、Asepects、Instramenetation提供了辅助型的增强功能,让整个开发更简单,也增强了健壮性(⽐如AOP⽇志)。Message提供了对⼀些消息的报⽂传送的优化等内容,为其他层提供增强型的辅助功能。Test层为其他层增强了健壮性。Spring源码结构(v5.2.7.RELEASE)在浏览器搜索很多Spring源码解析相关的⽂章,⼀上来就告诉你SpringIOC是什么?源码是怎么样的?让我们很困惑,在了解了Spring的框架结构之后,会发现其实Spring源码阅读似乎只需要阅读其中⼀些核⼼模块即可,其他的辅助模块其实是可以在使⽤到在去阅读的。现在在来看看Spring的源码结构究竟是怎么样的,以及和刚刚讲的Spring框架结构有什么关联。
Srping总共⼤约有20个模块,1300多个不同的⽂件组成。⽽这些组件被分别整合在核⼼容器层(CoreContainer)、数据访问及集成(DataAccess/Integeration)、AOP、Web、Messaging、Test这⼏个模块中。核⼼容器层(CoreContainer)核⼼层是这4个模块组成的。1、spring-beans,2、spring-core,3、spring-cotext,4、spring-expression。spring-beans和spring-core模块:是Spring框架的核⼼模块,包含了IOC(控制反转,InversionofControl)和DI(依赖注⼊,DependencyInjection)。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产品的需求⽽设计,使其可以⾮常⽅便的与SpringIOC进⾏交互。数据访问/集成层(DataAccess/Integration)数据访问/集成层是这5个模块组成。1、spring-jdbc,2、spring-tx,3、spring-orm,4、spring-jms,5、spring-oxm。spring-jdbc模块:这个是Spring提供的JDBC抽象框架的主要实现模块,⽤于简化SpringJDBC。主要是提供JDBC的模板⽅式、关系数据库对象化⽅式、SimpleJdbc⽅式、事务管理来简化JDBC编程,主要实现类是JdbcTemplate、SimpleJdbcTemplate、NamedParameterJdbcTemplate。spring-tx模块:这个是SpringJDBC事务控制实现模块。Spring框架对事务做了很好的封装,通过它的AOP配置,可以灵活的配置在需多求和应⽤中,直接使⽤JDBC事务控制还是有优势的。其实事务是以业务逻辑为基础的,⼀个完整的业务应该对应业务层⾥的⼀个⽅法。如果业务操作失败,则整个事务回滚。所以事务控制绝对应该放在业务层的。但是持久层的设计则应该遵循保证操作的原⼦性,即持久层⾥的每个⽅法都是不可以分割的。所以在使⽤SpringJDBC事务时,要特别注意其特殊性。spring-orm模块:这个是ORM框架的⽀撑模块,主要集成Hibernate、JavaPersistenceAPI(JPA)和JavaDataObjects(JDO)⽤于资源管理、数据访问对象(DAO)的实现和事务策略。spring-jmx(JavaMessagingService)模块:能顾发送和接受信息,⾃SpringFramework4.1以后,还提供了对spring-messaging模块的⽀撑。spring-oxm模块:提供了⼀个抽象层以⽀撑OXM(ObjectXMLMapping),是⼀个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模块,实现了SpringMVC(Model-View-Controller)的Web应⽤。spring-websocket模块:主要是与Web前端的全双⼯通讯的协议。spring-webflux模块:是⼀个新的⾮阻塞函数式ReactiveWeb框架,可以⽤来建⽴异步的,⾮阻塞的事件驱动的服务,并且扩
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- α-D-Glucopyranoside-ethyl-1-thio-2-3-4-6-tetraacetate-生命科学试剂-MCE
- WU-07047-生命科学试剂-MCE
- VU0418506-生命科学试剂-MCE
- Violaxanthin-Standard-生命科学试剂-MCE
- 郑州西亚斯学院《外国建筑史》2022-2023学年第一学期期末试卷
- 解耦服务故障诊断
- 投资合同协议投资效益
- 建筑分包合同与承包劳务
- 水电施工分包劳务协议
- 收养协议书英文范本
- DB11T 2103.2-2023 社会单位和重点场所消防安全管理规范 第2部分:养老机构
- 合肥市包河区2024年八年级上学期《生物》期中试题与参考答案
- 24年追觅在线测评28题及答案
- 2024年医务科工作总结标准范本(二篇)
- “一老一小”服务体系协同高质量发展对策研究
- 《白描人物摹神韵》 课件 2024-2025学年岭南美版(2024) 初中美术七年级上册
- 患者发生消化道大出血的应急演练
- 2024年浙江省宁波市鄞州中学强基招生数学试题
- 【课件】Unit+3(单元复习课件)七年级英语上册(人教版2024)
- 二十四节气之冬至节气主题班会课件
- 2024至2030年中国越野轮胎起重机行业发展预测及投资策略报告
评论
0/150
提交评论