spring框架做了几年的开发,只停留在会用的阶段上,然而spring的设计思想和原理确实一个巨大的宝库.大部分人仅仅知道怎么去配,或着加上什么属性就能达到什么效果,这些东西都可以通过查文档,查google来解决.关键是在怎么理解它,把它的思想变为你的东西。博主这几天没有学习(装逼),感觉心里甚是空虚,索性研究了下一直很好奇的spring大佬,毕竟写代码天天都在用,文章有什么说的不对的地方,你来打我呀(评论区来信砍).
前方高能,非战斗人员迅速投入战斗.本文将从实际出发,对spring实施剥洋葱,只要你愿意一层一层剥开它的心,你就能发现spring的全心全意(不要唱出来):
文章篇幅有限,只对大概内容做阐述,有兴趣的可以看看,本文也是基于该书总结出来的.
很多人一提ioc,遍张口就来:控制反转.究竟哪些方面被反转了呢?答案是依赖对象的获得被反转了.很多时候,我们通过多个对象之间的协作来完成一个功能,如果获取所依赖对象靠自身来实现,这将导致代码的耦合度高和难以测试.当然,控制反转还有一个好听的名字:依赖注入.
它的加载过程是什么样的呢?
BeanDefinition是一个接口,用于属性承载,比如<bean>元素标签拥有class、scope、lazy-init等配置。Bean的定义方式有千千万万种,无论是何种标签,无论是何种资源定义,无论是何种容器,只要按照spring的规范编写xml配置文件,最终的bean定义内部表示都将转换为内部的唯一结构:BeanDefinition。当BeanDefinition注册完毕以后,spring的BeanFactory就可以随时根据需要进行实例化了。
我们看出在BeanFactory里只对IOC容器的基本行为作了定义,根本不关心你的bean是怎样定义怎样加载的 - 就像我们只关心从这个工厂里我们得到到什么产品对象,至于工厂是怎么生产这些对象的,这个基本的接口不关心这些。
那么doGetBean里干了什么事情呢?
bean的加载经历了一个复杂的过程,其主要做了以下几件事(此段摘抄自):
其中,最重要的步骤是(7),spring的常用特性都在这里实现.
AOP集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context实现。
写到这里,博主总结一下阅读spring源码的心得:
1.学习spring思想和编码规范。spring的很多函数代码量大,逻辑复杂,而spring的编码风格就是将复杂的逻辑分解,分成N个小函数的嵌套,每一层都是对下一层的总结和概要。博主在工作中最佩服的一个大神说过:学习spring源码思想为我所用,哪怕是一天学习一个变量名.他在工作中设计很多小组件的时候都是基于spring思想和规范,他说,不要迷茫学什么技术,其实每天只要进步一点点就好,突破的是自己,而不是某个领域.用10年其实才敢说入门一门技术.
3.放弃阅读源码是一个不明智的选择,因为你失去了跟大师学习的机会.当你硬着头皮读完一个框架的源码,则其他框架都是想通的.
4.博主的下一篇文章,敬请期待:spring Aop实现原理及探究 因为篇幅有限,而博主的已经搞了一天代码,手已经快练成麒麟臂,Aop又是一个重要且内容比较多的部分,所以打算单独拿出来搞事情。