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

为何要有Spring?

      不管在解析源码,仍是在看待其余问题上,首先先来看第一个问题,为何要有Spring?为何Spring这么流行?为何会有Spring?前端

      C++这个语言相信了解过的都知道,其对象是须要手动回收的,而Java的优势之一就是会自动回收不用了的对象。可是若是在一个项目中,若是建立的对象过多,这个建立速度超过了达到回收条件的时限时,内存就会爆掉。那么不少人就会想,不少建立的对象其实都是重复的,可否把这些对象集中起来,不用重复去建立,提升整个对象的利用率,那么就能够下降整个建立过多对象而致使内存爆掉的问题发生几率了。java

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

 

什么是Spring?

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

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

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

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

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

      控制反转(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个模块组成的。一、spring-beans,二、spring-core,三、spring-cotext,四、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个模块组成。一、spring-jdbc,二、spring-tx,三、spring-orm,四、spring-jms,五、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个模块组成的。一、spring-web,二、spring-webmvc,三、spring-websocket,四、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个模块组成的。一、spring-aop、二、spring-aspects、三、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个模块组成。一、spring-messaging。

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

 

Test层

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

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

 

Spring包依赖图

相关文章
相关标签/搜索