spring Ioc 源码剖析总结

bean的加载经历了一个复杂的过程,上面代码主要做了以下几件事(此段摘抄自《Spring源码深度解析》):
  1. 转换对应的beanName。如果name=“&aa”的,会去除&符号。或者标签带有alias(别名的意思),则取alias所表示最终的beanName。

  2. 尝试从缓存中加载单例bean。如果加载不成功,会再次尝试从singletonFactories中加载。

  3. bean的实例化。假如我们需要对工厂bean进行处理,那么这里得到的其实是工厂bean 的初始状态。真正干活的则是getObjectForBeanInstance定义factory-method方法返回的bean。

  4. 原型模式的依赖检查。如果A类有B的属性,B中有A的属性,则会产生循环依赖。参考:spring如何解决循环依赖问题http://www.cnblogs.com/bhlsheji/p/5208076.html

  5. 将存储的Xml配置文件的GernericBeanDefinition转换为RootBeanDefinition。前文提到的用于承载属性的BeanDefinition有三个实现,
    GernericBeanDefinition,RootBeanDefinition和ChildBeanDefinition,如果父类bean不为空的话,这里会把所有的属性一并合并父类属性,因为后续所有的Bean都是针对RootBeanDefinition的。

  6. 寻找依赖。在初始化一个bean的时候,会首先初始化这个bean所对应的依赖。

  7. 根据不同的scope创建bean。scope属性默认是singleton,还有prototype、request等。

  8. 类型转换。如果bean是个String,而requiredType传入了Integer,然后返回bean,加载结束。

其中,最重要的步骤是(7),spring的常用特性都在那里实现.

FactoryBean

首先要分辨BeanFactory 与 FactoryBean的区别, 两个名字很像,所以容易搞混。这里做一个简单的比喻你就明白了:

1.FactoryBean:工厂类接口,用户可以通过实现该接口定制实例化 bean的逻辑。我们把bean比作是人,那么FactoryBean则是女娲,首先它本身有人的特征,但它能够生产人。

2.BeanFactory :BeanFactory定义了 IOC 容器的最基本形式。如果bean还比作是人,那么它可以理解成三界,三界里有各种功能的人,它是一个容器,可以管理很多的人。

FactoryBean里干了什么事情?

publicinterfaceFactoryBean<T>{

//返回由FactoryBean创建的Bean实例,如果isSingleton返回true,则该实例会放到spring容器中单例缓存池中.

TgetObject()throwsException;

//返回FactoryBean创建的bean类型.

Class<?> getObjectType();

//返回由FactoryBean创建的bean实例的作用域是singleton还是prototype

booleanisSingleton();

}

它的作用不在这里做阐述,ref:Spring的FactoryBean使用http://www.cnblogs.com/quanyongan/p/4133724.html

写到这里,总结一下阅读Spring源码的心得:

  1. 学习Spring思想和编码规范。Spring的很多函数代码量大,逻辑复杂,而Spring的编码风格就是将复杂的逻辑分解,分成N个小函数的嵌套,每一层都是对下一层的总结和概要。
    在工作中最佩服的一个大神说过:学习Spring源码思想为我所用,哪怕是一天学习一个变量名,他在工作中设计很多小组件的时候都是基于Spring思想和规范。
    他说,不要迷茫学什么技术,其实每天只要进步一点点就好,突破的是自己,而不是某个领域。用10年其实才敢说入门一门技术。

  2. 跟了Spring代码的函数,你会或多或少发现一些规律:一个真正干活的函数其实是以do开头的,如doGetBean,而给我们错觉的函数,如getBean和createBean等等方法,其实只是从全局角度做一些统筹工作。

  3. 放弃阅读源码是一个不明智的选择,因为你失去了跟大师学习的机会。当你硬着头皮读完一个框架的源码,则其他框架都是相通的。

发布了8 篇原创文章 · 获赞 27 · 访问量 455

猜你喜欢

转载自blog.csdn.net/liuguang212/article/details/104778690