自己动手编写IoC容器(一)

很久没写技术性的文档,编写此文档的目的一来作为最近学习的总结,二来这里有不少和我一样做WEB开发刚刚开始挨踢生涯的毕业生,希望本文档对大家有所帮助。本文思路来自《疯狂java实战讲义》和网上的无数文章。

此文档主要的内容为设计并且实现一个简单的IoC容器,IoC我们每天都在用,但都是借助于第三方框架,我们可以试着自己写一个IoC最简单的容器,什么东西都要拆开了解才好玩。

本文档大体分为三个部分。

第一部分为IoC的基本原理和整体设计思路。

第二部分为Ioc的编码细节和要点。

第三部分为回顾总结。

                                                                                                                                       第一部分(1

IoC是控制反转的意思,名词有点拗口,从现实角度来想,如果我们想要用电脑,我们会自己买一堆半导体,显像管去自己做一台电脑吗?显然我们不会自己动手,而是去买一台,IoC也是这个意思,一个设计运行良好的系统是由各个对象互相作用而成,当一个对象需要另一个对象时,这个对象自己闭门造车的方式是不可取的,这会使对象和对象间的耦合降低到代码层次,通常我们可以采用面向接口的编程方式和工厂方法来解决对象间的耦合关系,IoC也是如此,IoC

是一个万能工厂,或者说IoC更像一个百货商场,你要什么,它都有,充分发挥拿来主义。

我们要自己写一个IoC容器,首先要明确一个IoC容器究竟帮我们做了什么?

    首先它会创建系统内需要的bean,这里用Spring习惯的说法bean来代替对象一词,IoC是怎么知道系统内需要什么bean呢,这就需要我们编写配置文件来告诉IoC容器,这就好比你去吃餐厅吃饭,告诉服务员你想要什么,他写好菜单,拿到厨房,然后你就可以等着上餐了,配置文件显然就是这份菜单,它记录着你需要的bean以及bean之间的关系,IoC这个大厨会根据配置文件做出你想要的bean,及bean之间的搭配。

当然IoC生成bean必须要借助反射技术,什么是反射呢,为什么要用反射呢?Java在类装载的时候会为每个类文件生成一个Class对象(其实类也是一种对象,晕不晕?有点哲学的意思),Class对象会纪录这个类的点点滴滴,它的继承层次,它的方法,它的属性等等,正是有了这个Class对象,我们才可在运行的是否获得某个类的详细信息进而可以在运行时操纵某个类生成它的实例调用它的方法,很显然我们需要在IoC容器启动的时候读取配置文件,配置文件会记录bean所在具体路径和bean之间的关系以及它的初始化策略生命周期等等,然后IoC容器就可以通过这个全限定类名来反射生成它的实例,当然还有很多情况需要考虑。

IoC容器启动时应该做些什么呢?如果说IoC容器启动未免有些玄乎,其实就是当实例化某个具体的IoC实现类时,容器的实现类应该完成怎样的初始化呢?

自己动手编写IoC容器(一)_第1张图片

下图是IoC容器启动时的时序图

我们必须先给配置文件定制一定的格式,以便我们可以按一定的规则来解析配置文件,

自然可以采用XML的方式,这里XML中的约束与Spring相同,具体的模板及约定请参照Springdtd文件。dtd文件可以算作是XML文件的模板。它对XML进行约束与验证,当然、怎么样的XML语法我们可以随心随意在dtd里设定。

解析XML文档是最重要的一步,我们解析出它的每一个beanbean的每一个属性,并将它们封装成对象,我们后来生成此bean实例的依据就是这个Element对象,它根据配置文件应该封装的最基本信息应该包括bean的全限定名,bean是否为延迟加载,bean是否为单例,以及bean之间的关系,bean是设置注入还是构造注入等等。

  根据IoC的功能需求,如果我们稍微斟酌一下,可以发现现在系统应该有这几种对象

(1)IoC容器类相当于入口类,它负责整合其他对象来进行配置文件的读取,创建bean,获得某个bean

(2)配置文件的读取类,解析类,它们负责配置文件的读取和解析并且把每个配置的bean都封装成Element对象

(3)负责实例化Bean的类,它根据所有的Element内的属性来进行不同创建bean的策略。

(4)负责对bean进行注入的类,它同样根据Element对象的内容来进行不同策略的注入。


你可能感兴趣的:(spring,bean,xml,IOC,Class,文档)