摘要:本文结合《Spring源码深度解析》来分析Spring 5.0.6版本的源代码。如有描述错误之处,欢迎指正。前端
做为一名开发人员,阅读源码是一个很好的学习方式。本文将结合《Spring源码深度解析》来分析Spring 5.0.6版本的源代码,如有描述错误之处,欢迎指正。web
Spring是2003年兴起的一个轻量级Java开源框架,旨在解决企业应用开发的复杂性。Spring发展至今,衍生出很是丰富的模块,并应用在多种场景,好比:桌面应用,Web应用等。Spring的模块化能够容许你只使用须要的模块,而没必要所有引入。数据库
1、总体架构express
1. 核心容器编程
2. 数据访问/集成数组
3. Web安全
4. AOP服务器
5. Test架构
2、设计理念app
3、使用场景
1. 典型的Spring web应用程序
2. Spring中间层使用第三方web框架
3. 远程调用
4. EJBs-包装现存POJOs
Spring框架是一个分层架构,他包含一系列的功能要素,并被分为大约20个模块,以下图所示(很遗憾,并无找到Spring5的架构图,下图是Spring4的,但结合Spring5的源码来看,该图仍是可以体现Spring5的核心模块)
这些模块被总结为如下几部分。
Core Container(核心容器)包含有Core、Beans、Context和Expression Language模块。Core和Beans模块是框架的基础部分,提供IoC(控制反转)和DI(依赖注入)特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的须要,并真正地容许你从程序逻辑中分离出依赖关系和配置。
Data Access/Integration(数据访问/集成)层包含有JDBC、ORM、OXM、JMS和Transaction模块,其中:
Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。全部这些都听从Spring的通用事务和DAO异常层次结构。
Web上下文模块创建在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。因此Spring框架支持与Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工做。Web层包含了Web、Web-Servlet、Web-Struts和Web-Porlet模块,具体说明以下。
AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现,它让你能够定义例如方法拦截器和切点。从而将逻辑代码分开,下降它们之间的耦合性。利用source-level的元数据功能,还能够将各类行为信息合并到你的代码中,这有点像.Net技术中的attribute概念。
经过配置管理特性,SpringAOP模块直接将面向切面的编程功能集成到了Spring框架中,因此能够很容易地使Spring框架管理的任何对象支持AOP。Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。经过使用Spring AOP,不用依赖EJB组件,就能够将声明性事务管理集成到应用程序中。
Test模块支持使用JUnit和TestNG对Spring组件进行测试。
Spring是面向Bean的编程(BOP:Bean Oriented Programming),Bean在Spring中才是真正的主角。Bean在Spring中做用就像Object对OOP的意义同样,没有对象的概念就像没有面向对象编程,Spring中没有Bean也就没有Spring存在的意义。Spring提供了IoC 容器经过配置文件或者注解的方式来管理对象之间的依赖关系。
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,能够用来减低计算机代码之间的耦合度。其中最多见的方式叫作依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。经过控制反转,对象在被建立的时候,由一个调控系统内全部对象的外界实体,将其所依赖的对象的引用传递给它。也能够说,依赖被注入到对象中。前面描述的模块使得Spring成为许多场景中的合理选择,从在资源受限设备上运行的嵌入式应用程序到使用Spring事务管理功能和Web框架集成的全面的企业应用程序。
有时状况并不容许你彻底切换到一个不一样的框架。Spring框架不是一个要么使用所有特性要么什么都用不了的解决方案,不强制使用其中的每一个功能。现存的前端如Struts,Tapestry,JSF或其余UI框架均可以同基于Spring的中间层整合在一块儿,从而使你可以使用Spring事务功能。你只须要使用ApplicationContext链接你的业务逻辑以及经过WebApplicationContext整合你的web层。
你可使用Spring的Hessian-,Rmi-或HttpInvokerProxyFactoryBean类来经过web服务访问现存的代码。远程访问现存应用程序并不困难。
Spring框架还为企业JavaBeans提供了一个访问抽象层,使你可以重用现有的POJO,并将其包装在无状态会话bean中,以便在可能须要声名式安全的可扩展,故障安全的web应用程序中使用。