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

原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文链接地址:『互联网架构』软件架构-spring源码之spring结构概述(八)

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

spring

历史

官网:https://github.com/spring-projects/spring-framework

从我开始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 http://github.global.ssl.fastly.net
192.30.253.112 http://github.com

配置加速功能,linux环境

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

添加
151.101.185.194 http://github.global.ssl.fastly.net
192.30.253.112 http://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源码。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,646评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,979评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,391评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,356评论 0 215
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,740评论 3 293
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,836评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,022评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,764评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,487评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,728评论 2 252
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,200评论 1 263
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,548评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,217评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,134评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,921评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,919评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,766评论 2 274

推荐阅读更多精彩内容