读书笔记-《Spring技术内幕》-计文柯(一):IoC容器的实现

来源:互联网 发布:js点击radio触发事件 编辑:程序博客网 时间:2024/05/08 02:34

一、IoC容器是什么——对IoC、DI的理解。

IoCInverse of control,控制反转。在没有使用任何工具时,我们常常通过new这个关键字来获得对象。这样的方式在当系统中类层次关系复杂,依赖众多时就非常不妥了。

DIDependency Inversion,依赖注入。即在我们的系统中所有出现的依赖关系,都放在xml里,并且在用户第一次索要bean(调用getBean方法)时来 生成/注入这个依赖关系。

例如在教学信息管理系统中,我们修改了Teacher类的属性,那么就得修改其构造方法,之后在依赖它的Student类中就也必须对new Teacher中构造参数部分进行修改。单人开发还好,可以自己随时改动,如果是多人开发,那么影响则更大。对此,我们采取的一个简单方法为使用工厂模式。让TeacherFactory向我们提供Teacher,而不是new一个Teacher,这个理念就是控制反转IoC了——即依赖对象的获得被反转了。同时,当我们使用工厂模式时,实际上只是一定程度的缓解了问题,我们依然是需要修改代码的,只是要修改的部分从Student变成了TeacherFactory。IoC容器则彻底把这些依赖部分放在了xml里,作出改动时再也不去改java代码,而是修改xml配置文件,可以把IoC容器堪称一个更强大的工厂。(理解图如下)


图1.1  理解IoC图


二、IoC容器BeanFactory、ApplicationContext的异同

BeanFactory:定义了IoC容器最基本的形态,提供了IoC容器应该遵守的服务契约。

ApplicationContext:IoC容器的高级形态,除了应该有的基本IoC功能外还支持应用事件,不同信息源等高级特性。

简单的理解:BeanFactory就像,ApplicationContext像大学生。大学生实现了的接口,拥有应该有的吃喝玩乐生老病死等基本方法,同时大学生又从大学那边实现了做毕业设计等高级方法。


图2.1  IoC容器接口设计图


三、IoC容器的初始化

BeanDefinition:就是POJO类在IoC容器的抽象,我们定义的POJO是一个个普通的java类,当IoC容器通过特定的步骤将其载入到容器中后,这些java类就成了容器内部的数据结构,让容器可以轻松的使用和管理它们(底层是通过维护一个HashMap)。


首先看看如何函数式的使用IoC容器

ClassPathResource res = new ClassPathResource("beans.xml");DefaultListableBeanFactory factory = new DefaultListableBeanFactory();XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);reader.loadBeanDefinitions(res);

可以看到,IoC容器的初始化过程:Resource定位、BeanDefinition的载入、IoC容器注册BeanDefinition

用打水的理解的话为:找到水源、把水打上来、把水装到各容器并贴好标签。

这里就只给出初始化过程中的方法调用栈,具体的代码大家可以通过看书、搜索、IDE里查看源代码等方式了解。


图3.1 资源定位时序图



图3.1 BeanDefinition载入时序图


        

图3.3BeanDefinition注册时序图


四、依赖注入

依赖注入的含义在第一部分已经给出,这里给出时序图即可。


五、总结

       在阅读这本书之前,对于Spring IoC部分仅仅有一点朦胧的了解,确切一点说是会用,但是往下了问一问三不知。读了书之后大概对IoC的初始化,BeanFactory ApplicationContext BeanDifinition有了了解,虽然谈不上有多深,源代码解析部分也只是过了一遍,但现在在使用Spring以及见到一些注解、Exception等时常会有一种恍然大悟的反应——原来这个就是书中说的XXX。我认为这样的理解程度刚刚好,最多也就是再熟悉一点,没有必要去把Spring下面所有类接口设计图和每个类的方法属性都背下来,因为框架始终是工具,总有更换的一天,但了解了它的设计思想,实现原理,那么面对新的框架就游刃有余了。


(转载请申明原地址大笑

0 0
原创粉丝点击