『互联网架构』软件架构-spring源码之spring结构概述(八)

169 阅读10分钟

spring从07年接触到目前2018年也差不多10年了,一个java的框架为什么能火这么多年。很多人对spring的使用轻车熟路,但是从未解读过spring的源码,老铁跟我一起看看源码,了解下内部的构造,只有源码读过的人才能获得上乘武功,软件开发不只是搬砖的老铁。内功熟悉原理,外功是灵活使用。内功好比电力,外功好比电机。内功的电力越强,电机的马力越大才能发挥巨大作用,相反如果电力弱,马力在强也是不行的。spring从单一的jar包,发展到现在十多个jar包,spring mvc 到spring boot 到spring cloud,从需要配置到现在0配置,封装的越来越厉害,导致的结果,如果不了解内核在强的马力,遇到问题可能无从下手。一起熟读spring源码尤为重要。

spring

####历史

官网:github.com/spring-proj…

从我开始java的编程开始一直都陪伴这我。第一次接触spring是在07年接触它的。从java的编程生涯一直在用spring,目前还没去过那个公司没用spring的。记得那时候流行是ssh(struts+spring+hibernate),每个人都会在简历上写上精通ssh,这3个框架号称是三驾马车。随着spring的发展越来越庞大,它从中间的服务,慢慢升级为往上走spring mvc,往下走是spring jdbc,springvm,随着struts和hibernate慢慢的使用下降,struts慢慢被spring mvc替换,hiberntate已经基本被mybatis替换了。截止到我写这篇文章的时候spring v5.1.3

2002年开发者Juergen Hoeller和Yann Caroff说服Rod Johnson创建一个基于基础结构代码的开源项目。Rod,Juergen和Yann于2003年2月左右开始合作该项目。Yan为新框架创造了“Spring”的名字。据Rod介绍,Spring是传统J2EE的“冬天”之后的新开始!

Rod Johnson的书以非常详尽,详实和实用的方式介绍了J2EE最佳实践的世界。从编码标准,idioms,单元测试,设计决策,持久性,缓存,EJB,model-2表示层,视图,验证技术到性能的公平批评,读者都可以体会从理论到实践,制约因素,风险以及最佳做法。本书确实是一个知识库。

2003年6月,Spring 0.9在Apache 2.0许可下发布。2004年3月,1.0版发布。有趣的是,即使在1.0发布之前,spring也被开发人员广泛采用。2004年8月,Rod Johnson,Juergen Hoeller,Keith Donald和Colin Sampaleanu共同创立了一家专注于Spring咨询,培训和支持的公司interface21。

Yann Caroff在早期离开了团队。Rod Johnson在2012年离开了团队。Juergen Hoeller仍然是Spring开发团队的积极成员。

自2004年1.0版本发布以来,Spring框架迅速发展。Spring 2.0于2006年10月发布,到那时,Spring的下载量超过了100万。Spring 2.0具有可扩展的XML配置功能,用于简化XML配置,支持Java 5,额外的IoC容器扩展,支持动态语言(如groovy,aop增强功能和新的bean范围)。

在Rod领导下管理Spring项目的Interface21公司于2007年11月更名为SpringSource。同时发布了Spring 2.5。Spring 2.5中的主要新功能包括支持Java 6/Java EE 5,支持注释配置,classpath中的组件自动检测和兼容OSGi的bundle。

2007年,SpringSource从资本获得了A轮融资(1000万美元)。SpringSource在2008年通过来自加速合作伙伴和B轮融资筹集了额外资本。SpringSource在此期间收购了多家公司(Covalent,Hyperic,G2One等)。2009年8月,SpringSource以4.2亿美元被VMWare收购!SpringSource在几周内收购了cloud foundry,这是一家云PaaS提供商。2015年,cloud foundry转移到了非营利cloud foundry基金会。

2009年12月,Spring 3.0发布。Spring 3.0具有许多重要特性,如重组模块系统,支持Spring表达式语言,基于Java的bean配置(JavaConfig),支持嵌入式数据库(如HSQL,H2和Derby),模型验证/ REST支持和对Java EE 6的支持。

2011年和2012年发布了许多3.x系列的小版本。2012年7月,Rod Johnson离开了团队。2013年4月,VMware和EMC通过GE投资创建了一家名为Pivotal的合资企业。所有的6应用项目都转移到了Pivotal。

2013年12月,Pivotal宣布发布Spring框架4.0。Spring 4.0是Spring框架的一大进步,它包含了对Java 8的全面支持,更高的第三方库依赖性(groovy 1.8+,ehcache 2.1+,hibernate 3.6+等),Java EE 7支持,groovy DSL for bean定义,对websockets的支持以及对泛型类型的支持作为注入bean的限定符。

2014年至2017年期间发布了许多Spring框架4.x.x版本。当前的Spring框架版本(4.3.7)于2017年3月发布。Spring框架4.3.8于2017年4月发布,并将成为4.x系列中的最后一个。Spring框架的下一个延续的主要版本是在5.0版本展开。

####架构

每个模块的功能如下:

核心容器(Core Container)

核心容器包括spring-corespring-beansspring-contextspring-context-supportspring-expression(SpEL,Spring表达式语言,Spring Expression Language)等模块。

spring-corespring-beans模块是[Spring框架的基础],包括控制反转和依赖注入等功能。BeanFactory是工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。

[Context](spring-context)模块是在[Core和Bean]模块的基础上建立起来的,它以一种类似于JNDI注册的方式访问对象。Context模块继承自Bean模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过Servelet容器)等功能。Context模块也支持Java EE的功能,比如EJB、JMX和远程调用等。ApplicationContext接口是Context模块的焦点。spring-context-support提供了对第三方库集成到Spring上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。

spring-expression模块提供了强大的[表达式语言]用于在运行时查询和操作对象图。它是JSP2.1规范中定义的统一表达式语言的扩展,支持set和get属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从Spring IoC容器检索对象,还支持列表的投影、选择以及聚合等。

AOP和检测(Instrumentation)

spring-aop模块提供了[面向切面编程](AOP)的实现,可以定义诸如方法拦截器和切入点等,从而使实现功能的代码彻底的解耦出来。使用源码级的元数据,可以用类似于.Net属性的方式合并行为信息到代码中。

spring-aspects模块提供了对AspectJ的集成。

spring-instrument模块提供了对检测类的支持和用于特定的应用服务器的类加载器的实现。javaagent 的支持和类加载器。spring-instrument-tomcat模块包含了用于tomcat的Spring检测代理。

消息处理(messaging)

Spring 4 包含的spring-messaging模块是从Spring集成项目的关键抽象中提取出来的,这些项目包括MessageMessageChannelMessageHandler和其它服务于消息处理的项目。这个模块也包含一系列的注解用于映射消息到方法,这类似于Spring MVC基于编码模型的注解。

数据访问与集成

数据访问与集成层包含JDBC、ORM、OXM、JMS和事务模块。  (译者注:JDBC=Java Data Base Connectivity,ORM=Object Relational Mapping,OXM=Object XML Mapping,JMS=Java Message Service)

spring-jdbc模块提供了[JDBC]抽象层,它消除了冗长的JDBC编码和对数据库供应商特定错误代码的解析。

spring-tx模块支持[编程式事务和声明式事务],可用于实现了特定接口的类和所有的POJO对象。  (译者注:编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由spring自动处理,编程式事务粒度更细)

spring-orm模块提供了对流行的[对象关系映射]API的集成,包括[JPA]、[JDO]和[Hibernate]等。通过此模块可以让这些ORM框架和spring的其它功能整合,比如前面提及的事务管理。

spring-oxm模块提供了对[OXM]实现的支持,比如JAXB、Castor、XML Beans、JiBX、XStream等。

spring-jms模块包含生产(produce)和消费(consume)消息的功能。从Spring 4.1开始,集成了spring-messaging模块。

Web

Web层包括spring-webspring-webmvcspring-websocketspring-webmvc-portlet等模块。

spring-web模块提供面向web的基本功能和面向web的应用上下文,比如多部分(multipart)文件上传功能、使用Servlet监听器初始化IoC容器等。它还包括HTTP客户端以及Spring远程调用中与web相关的部分。

spring-webmvc模块(即Web-Servlet模块)为web应用提供了模型视图控制([MVC])和REST Web服务的实现。Spring的MVC框架可以使领域模型代码和web表单完全地分离,且可以与Spring框架的其它所有功能进行集成。

spring-webmvc-portlet模块(即Web-Portlet模块)提供了用于Portlet环境的MVC实现,并反映了spring-webmvc模块的功能。

Test

spring-test模块通过JUnit和TestNG组件支持[单元测试]和[集成测试]。它提供了一致性地[加载]和[缓存]Spring上下文,也提供了用于单独测试代码的[模拟对象](mock object)。

  • 下载spring fremwork 源码

配置加速功能Windows环境

C:\Windows\System32\drivers\etc\hosts

最末尾添加两句话:

151.101.185.194 github.global.ssl.fastly.net 192.30.253.112 github.com

配置加速功能,linux环境

vi /etc/hosts
/etc/init.d/networking restart

添加 151.101.185.194 github.global.ssl.fastly.net 192.30.253.112 github.com

git clone https://github.com/spring-projects/spring-framework.git
#切换到对应分支
git checkout -b v4.3.8 v4.3.8.RELEASE

idea直接导入就可以了,如果没有gradle idea会自动下载的

面试场景回顾

  • 回顾下之前的面试经历 说下spring IOC

在没有spring ioc的时候,我们如果需要使用一个类的时候,

1.通过new的方式 2.通过另一个类new出来然后传递到指定需要的类里面 无论这2个那种方式,都会使我们之前的依赖关系很混乱,代码里面到处是new,而且服务的初始化也很混乱。 有了IOC的容器的话可以使服务类或者bean,进行一个管理,然后通过声明注入的方式到指定的类里面,里面用到了xml技术才可以对我们bean进行定义和解析,这就是反射的技术,才可以把一个bean注入到另一个bean里面,里面也用到了抽象工厂的模式。说实在的就是给程序员节省时间,说这句是不是无懈可击。

PS:直击源码的学习,springboot和springcloud慢慢主流,很多大型框架的思路都是借鉴了spring,相信读懂了常用的spring源码后,以后的路会越走越宽广。会在后面的博文里面多加入更多自己的心得体会,更加详细的一起学习spring源码。