Spring框架原理

一直在看Spring的相关课程,光关于Spring这个主题的课程,看了也不少了。但是,也就是能够学会一些套路,在日常的开发过程中,照葫芦画瓢的使用。一直没有对Spring有一个深刻的理解。
今天突然,在看了秦疆的课程之后,突然对于Spring有了一些独特的理解。虽然,秦疆讲的也不错,但是,也难免落入窠臼之中,惯于使用以前的老师们的授课套路来讲。

首先,在Spring之前,我们的开发面临什么样的问题

  • 以前我们的开发中,Controller中使用Service层时,需要自己手动去new。这是问题吗,这其实就不是问题。如果连手动去new都懒得做,就不要去做程序员了。
  • 如果后续维护过程中,需要替换原来的Service层,就要修改Controller中的new代码的地方。这不利于扩展,这看起来好像是个问题,注意,是好像。其实,我到目前为止都没有这样做过一次。这仍然没有说服力。
    从上面的场景入手,我宁愿返璞归真,使用硬编码的方式来开发代码。所以,我认为这些都没有说到点子上。如果要真正明白我们开发面临的困难,其实,我们不妨从Spring帮我们做了什么事情来反推。

其次,有了Spring之后,我们的开发变成了什么样

众所周知,大家现在使用的SSM,Spring Boot的那样的开发就是。

最后,Spring框架的原理是什么,或者说,Spring到底帮我们做了什么事情

这里有两个关键词:IoC (对象创建的控制权从程序猿手中反转给了容器)、DI(注入对象依赖的其他组件)。
上面的关键词,我写了自己的理解阐述。

  • Spring首先是一个IoC容器。那么,这个Spring就相当于是一个玻璃罐子。在这个罐子里,我们可以放入各种各样的Bean(豆子)。这里,涉及到一个问题,就是Bean从哪里来。也就是说,Spring解决了一个对象创建的问题。Spring是如何解决这个对象创建的事情呢,就是从我们的配置文件的信息中,获取到他创建一个类对象所需要的的信息,然后存储在容器之中。
  • 我们使用这些Bean,直接拿来用即可,因为罐子中保存了这些Bean。但是,我们实际中会这样做吗。当然不会啦。因为,都是从Spring容器中,直接获取对象的话,这不就是脱裤子放屁嘛,所以,IoC这一步也是为了接下来更好的使用做准备的。大规模的使用中,我们都是用依赖注入的的方式来使用这些Bean,其实,这解决的是一个类组织的问题。

所以,通过上面的分析就是,Spring 通过配置文件创建对象,并保存在IoC容器中,然后,在通过DI依赖注入的方式,让我们去组织和使用容器中创建的对象。前半部分,是Spring容器帮我们做的事情,后半部分,需要我们程序猿去做。
那我们仔细看看这句话Spring 通过配置文件创建对象,并保存在IoC容器中,说白了,能够通过字符串去动态获取对象,也只能使用Java的反射技术了。所以,我们就能够从反射技术去反推Spring能玩出什么新花招。

  1. 反射技术通过字符串动态生成一个对象,Spring基于这个特性实现配置创建对象;
  2. 反射技术通过字符串调用方法setter,Spring基于这个特性实现配置对象的属性赋值;
  3. 反射技术通过字符串调用构造方法,Spring基于这个特性实现配置对象的构造方法创建;
    还有很多的花样和玩法,总而言之,从反射技术去理解Spring的配置,Spring就是创建了对象,并把对象能够按照配置组织起来。那这对于我们有啥好处呢?其实,也没有什么好处。反倒显得有些臃肿。我们跳过这个抓耳挠腮寻找好处的环节,来说Spring的AOP。

Spring AOP

Spring利用Java的动态代理的技术实现了面向切面编程。就是从方法中通用的一些逻辑,操作抽离出来做一个统一的处理调用。这相当于Spring给我们一个AOP的一个标准实现,让我们来解决相对应的场景,这还是不错的。就拿事务而言,我们就要用容器中管理的对象,如果没有容器,我们当然也是可以实现的。这不过提供了一点便捷。我们再说,Mybatis的通过接口调用这一步,通过动态代理Mybatis生成了Mapper的实现类。我们真正去调用的话,就需要自己去手动调用。也是可以实现的,但是就没有那么便捷了。这里或许能够体现一点Spring容器的好处吧。

这样梳理下来,我发现,貌似在我们的日常开发中,并不能体会到Spring容器的好处。甚至是增加了复杂度和臃肿。从流程上来看,Spring 相当于是一个中间件,相当于是一个代码的协作规范。规范的坏处是什么,就是缺少了灵活性,同时也牺牲了简单性。但是,规范带来的好处是解耦,以及让更多更多的人和组织能够参与进来,方便代码、组件的复用。也就是说,以前大家都是各自为政,最后需要协作的时候,又各有不同,无法顺畅协作。有了Spring容器之后呢,大家就都面向Spring“规范”编程。这样就能避免协作困难的问题了。所以,课程里简单的举例对象创建由Spring容器管理,并不能体现Spring的好处,反而显得怪异。真正的好处,是要放在更多的团队协作上来说。

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

推荐阅读更多精彩内容