思考
如果让你手写一个IOC容器你要怎么写呢?你的思路是什么?都要考虑哪些问题?都要使用哪种设计模式?
IOC容器的晋升之路
当我们想要做一个IOC容器来盛放生成的对象时,我们的初步想法是通过工厂方法+配置文件来实现建议的IOC容器。
但当出现循环依赖的时候,我们发现上面的简单IOC容器不能满足需求,思考我们是否可以将对象的创建过程,即实例化与初始化拆开。(本文主要是对IOC容器的讲解,代理对象及循环依赖的三级缓存暂时先不进行深入研究)
思考:多个配置文件与BeanDefinition直接关联,耦合性较高,如何解耦呢?
没有什么是中间加一层解决不了的问题,此处我们添加一个接口。
思考:如果我想要对类进行动态的修改怎么办?
这里可以想到我们常用的设计模式:代理模式的思想,添加一个增强器。
思考:我们是否可以在创建对象前后也添加一些增强器来动态的修改我们要创建的Bean对象呢?
此处细化初始化步骤。
思考:实例化与初始化的区别是什么呢?
实例化是在内存开辟一个空间并设置默认值。初始化是对属性赋实际值。
经过以上的思考,我们就可以从宏观的层面理解Spring是如何编写IOC容器的,当然,Spring中的IOC考虑的面还有很多。
小编在这里从宏观的角度进行了简单的梳理,更多的是希望大家在看Spring源码的时候,不要只纠结于他们是如何实现的,我们还可以从源码中抽离出来,站在更高层面上思考,Spring为什么要这么设计,里面的逻辑是什么,思考是什么,又是通过哪些设计模式,设计原则达到的可拓展,可复用,可维护的。