spring IOC使应用中依赖管理变得简单,所以的bean创建,以及当前bean所需要的另外类的实例都由容器来管理。
想像下,如果不用spring ioc。有业务类A,需要业务类B的实例。而业务类B需要业务类C的实例。这里如果业务类A为入口main方法,我们需要进行以下几个步聚完成A类的实例化:
1.手动创建C类实例
2.然后创建B类实例并将之前创建的C类实例插入到B的字段中
3.最后创建A的实例,并将B的实例插入到A类的字段中
可以想像实例化,并管理这些依赖的过程对于程序员来说,简直是灾难。如果后续C类又需要D类的字段,又需要改动这段初始化代码。
基于以上原因,我们想像下,这部分实例化及依赖管理能够由第三方管器来做,而程序员只需关心业务逻辑。
我们希望,第三方容器的引入对现有项目代码应该影响很小,因此可以考虑用专门的配置文件来做。这样对原有类没有任何侵入。
spring容器就是基于这样一目标而设计的。
spring有许多款容器供用户选择,如ApplicationContext,ClassPathXMLApplicationContext等。
spring 设计容器时,定义了一个beanFactory接口,定义了最常用的几个操作:getBean,containsBean,getType等。
而基于这个beanFactory,在设计实现时,原则上重用一些代码,这个可以用继承与组合。spring中,用继承来复用大量的代码。
beanFactory继承体系如下,此处只研究XmlBeanFactory这个分支:
beanFactory->AutowireCapableBeanFactory->AbstractAutowireCapableBeanFactory->DefaultListableBeanFactory->XmlBeanFactory